为 HttpClient 设置用户代理类型

97 阅读2分钟

在代理内部使用了 Microsoft Ajax 技术的 ASP.NET WebForm 页面的时候,比如说,SSRS 的页面,可能会遇到这样的错误

"`Sys.WebForms` is undefined in Chrome (latest version)"

或者

"Unable to get property 'PageRequestManager' of undefined or null reference"

实际的原因倒是很简单,ASP.NET 内部有一个识别客户端代理是否支持 Ajax 的机制,它依赖于客户端所使用的浏览器,内部是通过检查 User-Agent 这个请求头来判断的。对于 ASP.NET 不能识别的浏览器,它认为不能保证浏览器支持 Ajax。导致 ScriptManager 中没有包含 MicrosoftAjaxWebForms.js 。也就找不到这个 Sys.WebForms 了。

See: stackoverflow.com/questions/3…

解决的方式就是为 HttpClient 配置有效的 User-Agent 值。

ProductInfoHeaderValue 类型提速了请求头中 User-Agent 请求头的表示,该请求头的定义来自 IETF 的 RFC 2616 .

对于 ProductInfoHeaderValue 来说,请求头的名称已经是 User-Agnet 了,它需要提供一个 ProductHeaderValue 来作为这个 User-Agent 请求头的值。ProductHeaderValue 的 Name 提供了产品的名字,而 Version 提供了产品的版本信息。

如果不需要版本信息,可以如下进行配置。

var httpClient = new HttpClient();

httpClient.DefaultRequestHeaders.UserAgent.Add(
    new ProductInfoHeaderValue(
        new ProductHeaderValue("CNBlogs")));

为了方便,ProductInfoHeaderValue 还提供了一个直接使用字符串的构造函数。

var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.UserAgent.Add(
    new ProductInfoHeaderValue("CNBlogs", null));

更简单的方式是绕过这个复杂的 ProductInfoHeaderValue 类型,直接提供一个字符串,让 System.Net.Http.Headers.HttpRequestHeaders 自己去解析它。DefaultRequestHeaders 的类型就是这个 HttpRequestHeaders。

var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("User-Agent", "contact@cnblogs.com");

注意不要丢掉了中间的中划线 (-),

为了防止写错字符串,还可以使用 HeaderNames 这个静态泪的属性

public static readonly string UserAgent;

这样就变成了

var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add(HeaderNames.UserAgent, "contact@cnblogs.com");

See: learn.microsoft.com/en-us/dotne…

参考