为WebClient请求设置User-Agent标题

为Windows Phone 7的WebClient请求设置User-Agent标题的正确方法是什么? 我find了两个选项,但不知道哪一个是正确的。 考虑一个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; 

你能告诉我以上两种方法中的哪一种是正确的?

你可以在这里 (msdn)显示一个样本“正确的”,在你的WebClient for C#和Here (msdn)中添加一个用户代理来显示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"; 

要么

 request.UserAgent = "appname"; 

我发现WebClient在一个请求后一直删除我的User-Agent头,我每次都厌倦了设置它。 我用一个黑客来永久设置User-Agent,方法是创build自己的自定义WebClient并重写GetWebRequest方法。 希望这可以帮助。

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

作为对其他答案的补充,这里是微软对其浏览器的用户代理string的指导。 用户代理string因浏览器(Internet Explorer和Edge)和操作系统(Windows 7,8,10和Windows Phone)而异。

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

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

和用于Windows Phone 8.1更新的Internet Explorer

 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浏览器提供了用于用户代理string的模板。 查看一些Edge用户代理string示例的答案 。

最后, 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 
 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; } } 

你也可以使用:

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