为WebClient请求设置用户代理标头

73

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

WebClient client = new WebClient();

我看到了两个选项:

设置 User-Agent 的方法如下:
  1. 使用以下代码设置:

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

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

请问上述两种方法中哪一种是正确的?

6个回答

121

您可以查看WebClient文档以获取一个在C#中为您的WebClient添加User-Agent的示例,这里是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";

27

我发现在进行一次请求之后,WebClient会删除我的 User-Agent 标头,而我每次都需要设置它,这让我感到很疲倦。我采用了一种方法来永久设置 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;
    }
}

17

您也可以使用它:

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

4
作为其他答案的补充,以下是微软针对其浏览器用户代理字符串的指南。不同的浏览器(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 

针对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

针对Edge桌面版、移动版和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

1
这对我有用:

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


-3
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
仅有代码并不是答案,您能否解释它的作用以及为什么应该使用它? - Jérémie Bertrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接