解决 必须使用适当的属性和方法修改 User-Agent 错误

问题描述:近在项目中有一个需求为需要在 Http 的Header里面添加一个User-Agent参数,当请求时。项目本身的目标框架是 .NET Standard 2.0。于是,在项目源码中发现了,最终调用的请求是使用 HttpWebRequest 来进行最后的封装和发送的。

首先是用 HttpRequest 包装的,代码如下:

request.Headers["User-Agent"] = "Windows 10.0.2.4";

然后到最后发请求时,foreach 这个Headers 的 Dictionary<string,string> 类型的,然后copy to HttpWebRequest 的这个Header中

foreach (var header in request.Headers)
{
httpWebRequest.Headers.Add(header.Key, header.Value);
}

本地也进行了相关的 UT 和 FT,一切都很完美。然后发布了新版本。

版本发布后的第三天,接到了用户的一个反馈说:

在调用最新Nuget版本的包后,请求调用一直报错:必须使用适当的属性和方法修改 User-Agent

首先先让用户回退到上一个版本的包,然后询问了用户的目标框架,用户说是.Net framework 4.6.1,刚开始我以为是不是我项目中引用的某个包不支持该版本啊,沿着这个思路,果然有所发现。我发现在获取用户当前系统版本的时候使用了这个类System.Runtime.InteropServices.RuntimeInformation.OSDescription,然后我发现这个属性可能为空,是不是属性空导致这个错误的呢?抱着试一试的态度,继续往下。

去官方文档看了看,这个包最低支持的.net framework 框架为 4.7.1 。我想,那如果我在目标框架中也包含了.net framework 4.7.1 会不会就不报错了呢。

继续沿着这个思路,我去寻找了: 如何在csproj 文件中指定多个 targetframework ,于是也便有了这个提问,如何发布多个 TargetFramework 的nuget 包 。当我设置完了这个目标框架,测试时发现,怎么还是不行呢。我发现我可能走错路了,可能根本就不是这个地方出现问题了,是不是我问题定位的有问题。而且奇怪的是,

为什么如果我本地目标框架是 .netcoreapp2.0 或者 .net standard2.0 时就不会报错呢?好奇怪。

于是,我继续开始设置断点进行调试,最终发现了,每次走到下面这段代码时就会曝出上面那条错误:

 httpWebRequest.Headers.Add(header.Key, header.Value);

这到底是为什么呢,为什么添加其他属性时就不会有这个错,终于还是在微软的官方文档上找到了答案:

HttpWebRequest exposes common HTTP header values sent to the Internet resource as properties, set by methods, or set by the system; the following table contains a complete list. You can set other headers in the Headers property as name/value pairs. Note that servers and caches may change or add headers during the request.

The following table lists the HTTP headers that are set either by properties or methods or the system.

Header Set by
Accept Set by the Accept property.
Connection Set by the Connection property, KeepAlive property.
Content-Length Set by the ContentLength property.
Content-Type Set by the ContentType property.
Expect Set by the Expect property.
Date Set by the system to current date.
Host Set by the system to current host information.
If-Modified-Since Set by the IfModifiedSince property.
Range Set by the AddRange method.
Referer Set by the Referer property.
Transfer-Encoding Set by the TransferEncoding property (the SendChunked property must be true).
User-Agent Set by the UserAgent property.

也就是说呢,如果你的Headers中没有包含上述的12个属性,我就当成它为保留属性把,你都可以用以下命令设置

httpWebRequest.Headers.Add(header.Key, header.Value);

然而当涉及到上述的属性的话,你就需要像下面这样

if(header.key.contains("User-Agent"))
{
httpWebRequest.UserAgent = "Set as you like";
}

总结起来还是经验不够,小问题定位错误导致排查错了方向,一旦找对方向,就很容易解决啦。

PS:下一篇写一下 httpWebrequest 中的timeout,这个也坑死我了。

解决和排查 "必须使用适当的属性和方法修改 User-Agent" 错误时遇到的一些坑的更多相关文章

  1. 解决Table不继承父节点的属性的方法

    解决Table不继承父节点的属性的方法 发现table不继承父节点的属性. 解决方法:给html文件加上<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...

  2. 解决IE10以下对象不支持“bind”属性或方法

    IE10一下的浏览器,如果在JS代码中用了bind函数,那么就会报“SCRIPT438: 对象不支持“bind”属性或方法” 因为浏览器没有提供这个参数的方法,所以我们就自己写一个bind,来让这个参 ...

  3. 必须使用适当的属性或方法修改“ContentType”标头

    只能通过属性修改ContentType,不能添加到header属性里

  4. SCRIPT438: 对象不支持“indexOf”属性或方法

    SCRIPT438: 对象不支持“indexOf”属性或方法 indexOf()的用法:返回字符中indexof(string)中字串string在父串中首次出现的位置,从0开始!没有返回-1:方便判 ...

  5. Python_魔法属性和方法

    魔法属性 __doc__:表示类或方法的描述信息 __moudle__:表示当前操作对象的模块,当前模块时,显示__main__ __class__:表示当前操作对象的类型 __name__:表示类或 ...

  6. cookie工具类,解决servlet3.0以前不能添加httpOnly属性的问题

    最近在解决XSS注入的问题,由于使用的servlet版本是2.5,不支持httpOnly的属性,故做了个工具类来实现cookie的httpOnly的功能.全类如下: /** * cookie工具类,解 ...

  7. 对象不支持“attachEvent”属性或方法的解决办法

    有些脚本在IE11下执行会报错误: 对象不支持“attachEvent”属性或方法 解决办法 解决办法:把attachEvent改为addEventListener即可

  8. IE显示对象不支持此属性或方法 的解决方法

    用C# 编写的ActiveX控件, 调试时,在世界之窗浏览器里能正确显示,但是不能和JS交互,也没有传说中的错误信息框出现,查了很多文档,后来想问题是不是出在浏览器上,换在IE8里调试,点击交互按钮, ...

  9. 关于使用jquery时,ie8下提示对象不支持的属性或方法的解决办法

    转自:http://wapapp.baidu.com/auoong/item/538790fcbe87c834d7ff8cde 首先这个问题的前提是已经排除了常见的这个问题.下面说一种今天我碰到的一种 ...

随机推荐

  1. Confluence 6 后台中为站点添加应用导航

    Confluence 6 后台中为站点添加应用导航的连界面和方法. https://www.cwiki.us/display/CONFLUENCEWIKI/Configuring+the+Site+H ...

  2. Confluence 6 导入模板的定义

    模板是一个预先定义的页面,这个预先定义的页面可以在创建新页面的时候预先载入.模板能够给一个页面统一的样式或格式. 你可以在 Confluence 中创建你自己的模板,请查看页面 Create a Te ...

  3. 移动端点击出现阴影 css解决方案

    a,img,button,input,textarea,div{-webkit-tap-highlight-color:rgba(255,255,255,0);}

  4. D3.js+Es6+webpack构建人物关系图(力导向图),动态更新数据,点击增加节点,拖拽增加连线...

    觉得不错的麻烦加个Star:https://github.com/zhangzn3/D3-Es6 在线预览地址:https://zhangzn3.github.io/D3-Es6 功能列表:1. 增加 ...

  5. JS实现的ajax和同源策略

    一.回顾jQuery实现的ajax 首先说一下ajax的优缺点 优点: AJAX使用Javascript技术向服务器发送异步请求: AJAX无须刷新整个页面: 因为服务器响应内容不再是整个页面,而是页 ...

  6. 使用7zip批量压缩文件夹到不同压缩包

    for /d %%X in (*) do "c:\Program Files\7-Zip\7z.exe" a "%%X.7z" "%%X\" ...

  7. C++ Primer 笔记——变量

    1. 初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来代替. 2.使用列表初始化内置类型的变量时,如果初始值存在丢失信息的风险,则编译器将报错 ...

  8. ubuntu下如何编译C语言

    ubuntu下如何编译C语言     如果没有gcc编译器的话,使用以下命令获取 ~# sudo apt-get install gcc同时要下载辅助工具 ~# sudo apt-get instal ...

  9. jQuery常见案例

    jQuery常见案例 通过jQuery实现全选,反选取消: 选择 地址 端口 1.1.1.1 80 1.1.1.1 80 1.1.1.1 80 1.1.1.1 80 代码实现 <body> ...

  10. org.apache.thrift.transport.TTransportException: Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083.

    1.启动hive的过程中,[hadoop@slaver1 soft]$ hive --service metastore &错误如下所示: 原因:之前启动hive失败了,但是进程以及启动起来, ...