【问题标题】:Setting the User-Agent header for a WebClient request为 WebClient 请求设置 User-Agent 标头
【发布时间】:2012-08-07 07:56:26
【问题描述】:

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

WebClient client = new WebClient();

我看到了 2 个选项:

  1. 使用以下方式设置用户代理:

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

    WebHeaderCollection headers = new WebHeaderCollection();
    headers[HttpRequestHeader.UserAgent] = "userAgentString";
    client.Headers = headers;
    

您能否告知以上两种方法中哪一种是正确的?

【问题讨论】:

    标签: c# windows-phone-7


    【解决方案1】:

    您可以查看WebClient documentation 中的 C# 示例,该示例将用户代理添加到您的 WebClienthere 中以获取 Windows Phone 示例。

    这是 C# 的示例:

    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) 的示例:

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

    【讨论】:

      【解决方案2】:

      我发现 WebClient 在一个请求后不断删除我的 User-Agent 标头,我厌倦了每次都设置它。我通过制作自己的自定义 WebClient 并覆盖 GetWebRequest 方法,使用 hack 永久设置 User-Agent。希望这可以帮助。

      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;
          }
      }
      

      【讨论】:

        【解决方案3】:

        你也可以使用它:

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

        【讨论】:

          【解决方案4】:

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

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

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

          对于 Internet Explorer for Windows Phone 8.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
          

          为桌面、移动和 WebView 的 Edge 浏览器的用户代理字符串提供了模板。有关某些 Edge 用户代理字符串示例,请参阅 this answer

          最后,another page on MSDN 为旧桌面操作系统上的 IE11 提供了指导。

          Windows 8.1 上的 IE11

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

          Windows 7 上的 IE11

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

          【讨论】:

            【解决方案5】:

            这对我有用:

            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 的文档

            【讨论】:

              【解决方案6】:
              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;
                  }
              }
              

              【讨论】:

              • 仅代码不是答案,您能解释一下它的作用以及为什么要使用它吗?
              猜你喜欢
              • 2017-12-18
              • 1970-01-01
              • 1970-01-01
              • 2014-05-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-06-02
              • 1970-01-01
              相关资源
              最近更新 更多