关于c#:设置WebClient请求的User-Agent标头

Setting the User-Agent header for a WebClient request

为Windows Phone 7的WebClient请求设置User-Agent标头的正确方法是什么?
我找到了2个选项,但不确定哪个是正确的。考虑一个WebClient对象:

1
WebClient client = new WebClient();

我看到了2个选项:

  • 使用以下命令设置用户代理:

    1
    client.Headers["User-Agent"] ="myUserAgentString";
  • 使用WebHeaderCollection设置用户代理:

    1
    2
    3
    WebHeaderCollection headers = new WebHeaderCollection();
    headers[HttpRequestHeader.UserAgent] ="userAgentString";
    client.Headers = headers;
  • 能否请您告知上述两种方法中的哪一种是正确的?


    您可以查看WebClient文档以获取将User-Agent添加到您的WebClient的C#示例,还可以查看Windows Phone的示例。

    这是C#的示例:

    1
    2
    3
    4
    5
    6
    7
    WebClient client = new WebClient ();

    // Add a user agent header in case the
    // requested URI contains a query.

    client.Headers.Add ("user-agent","Mozilla/4.0 (compatible; MSIE 6.0;" +
                                     "Windows NT 5.2; .NET CLR 1.0.3705;)");

    这是Windows Phone(Silverlight)的示例:

    1
    2
    3
    request.Headers["UserAgent"] ="appname";
    // OR
    request.UserAgent ="appname";

    我发现一个请求后,WebClient一直在删除我的User-Agent标头,我已经厌倦了每次设置它的麻烦。我通过创建我自己的自定义WebClient并覆盖GetWebRequest方法,使用黑客来永久设置User-Agent。希望这可以帮助。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class CustomWebClient : WebClient
    {
        public CustomWebClient(){}

        protected override WebRequest GetWebRequest(Uri address)
        {
            var request = base.GetWebRequest(address) as HttpWebRequest;
            request.UserAgent="Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0;)";

            //... your other custom code...

            return request;
        }
    }

    您也可以使用:

    1
    client.Headers.Add(HttpRequestHeader.UserAgent,"My app.");

    作为其他答案的补充,这是Microsoft针对其浏览器的用户代理字符串的指南。用户代理字符串因浏览器(Internet Explorer和Edge)和操作系统(Windows 7、8、10和Windows Phone)的不同而不同。

    例如,以下是Windows 10上Internet Explorer 11的用户代理字符串:

    1
    Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko

    以及用于Windows Phone 8.1更新的Internet Explorer:

    1
    Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 520) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537

    为用于Desktop,Mobile和WebView的Edge浏览器的用户代理字符串提供了模板。有关某些Edge用户代理字符串示例,请参见此答案。

    最后,MSDN上的另一页为较旧的桌面操作系统上的IE11提供了指南。

    Windows 8.1上的

    IE11:

    1
    Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko

    Windows 7上的

    和IE11:

    1
    Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko

    这对我有用:

    1
    2
    3
    4
    var message = new HttpRequestMessage(method, url);
    message.Headers.TryAddWithoutValidation("user-agent","<user agent header value>");
    var client = new HttpClient();
    var response = await client.SendAsync(message);

    在这里您可以找到TryAddWithoutValidation

    的文档


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    const string ua ="Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)";
    Request.Headers["User-Agent"] = ua;
    var httpWorkerRequestField = Request.GetType().GetField("_wr", BindingFlags.Instance | BindingFlags.NonPublic);
    if (httpWorkerRequestField != null)
    {
        var httpWorkerRequest = httpWorkerRequestField.GetValue(Request);
        var knownRequestHeadersField = httpWorkerRequest.GetType().GetField("_knownRequestHeaders", BindingFlags.Instance | BindingFlags.NonPublic);
        if (knownRequestHeadersField != null)
        {
            string[] knownRequestHeaders = (string[])knownRequestHeadersField.GetValue(httpWorkerRequest);
                        knownRequestHeaders[39] = ua;
        }
    }