为 WebClient 请求设置 User-Agent 标头

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

WebClient client = new WebClient();

我看到了两个选择:

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

    client.Headers["User-Agent"] = "myUserAgentString";
    
  2. set the User-Agent using the WebHeaderCollection:

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

Can you please advise which of the 2 methods above is the proper one?

144196 次浏览

您可以检查 WebClient文档中的 C # 示例,该示例将用户代理添加到您的 WebClient中,并检查 给你中的 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";

我发现 WebClient 在一个请求之后不断删除我的 User-Agent 头,我厌倦了每次都设置它。我使用了一个黑客设置用户代理永久通过制作自己的自定义 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;
}
}
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;
}
}

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

例如,下面是 视窗10的 Internet Explorer 11的用户代理字符串:

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

给出了用于桌面、移动和 WebView 的 Edge浏览器的用户代理字符串的模板。有关边缘用户代理字符串示例,请参见 这个答案

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

你也可以使用:

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

这对我很有效:

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

在这里您可以找到 没有验证的尝试的文档