在代理内部使用了 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…