2012-08-07 112 views
43

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

WebClient client = new WebClient(); 

我看到2个选项:

  1. 设置的User-Agent使用:

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

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

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

回答

78

你可以去here(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"; 
18

我发现WebClient的保持在一次请求后删除我的用户代理头,我厌倦了每次都设置它。我使用了一种技巧来永久设置用户代理,方法是制作自己的自定义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; 
    } 
} 
-2
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; 
    } 
} 
+4

代码不仅是一个答案,你能解释它做了什么,为什么它应该使用? – 2015-01-24 08:06:46

1

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

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

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

Internet Explorer中的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 

模板是针对Desktop,Mobile和WebView的Edge浏览器的用户代理字符串提供的。有关Edge用户代理字符串示例,请参阅this answer

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

IE11在Windows 8.1

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

IE11在Windows 7

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

您也可以使用:

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