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

解决 必须使用适当的属性和方法修改 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,这个也坑死我了。

posted on 2019-03-12 22:33 BUTTERAPPLE 阅读(...) 评论(...) 编辑 收藏

公告

统计

  • 随笔 - 83
  • 文章 - 0
  • 评论 - 41
  • 高温“烤验”,品读这些自带凉意的避暑诗词 2019-05-19
  • 2015科教频道中秋晚会《天涯共此时》 2019-05-19
  • 特朗普政府用政治“边缘政策”处理贸易问题是玩火 2019-05-17
  • 高清:探访苟坝见证历史 红军在此留下珍贵遗物 2019-05-15
  • 交通小事故,几分钟就能处理完 2019-05-15
  • 在现时代,无论中国还是西方发达国家都是社会财富公有制和私有制并存的社会,由于仍旧存在社会财富私有制,所以必然存在贫富差别,离开私有制来谈“贫”和“富”... 2019-05-15
  • 【学习时刻·经济实说②】管清友:中央经济工作会议的十大亮点 2019-05-15
  • 绿染江源,千湖归来——三江源生态保护建设取得阶段性成效 2019-05-13
  • 把握和传承好“变则通”思想(大家手笔) 2019-05-13
  • 5月份70个大中城市商品住宅销售情况:一线城市商品房价格同比持续下降 2019-05-08
  • 官方:装备管理失职 恒大俱乐部总经理等人遭处罚 2019-05-01
  • 中共一大代表中最早辞世的王尽美:3首小诗与27年人生 2019-04-29
  • 不管怎么修饰辞藻,只要放弃革命,就是苏联的结果,还用证明吗? 2019-04-27
  • 新和县:12333为参保群众提供咨询便利 2019-04-22
  • 秋冬进补“小人参” 称霸国人餐桌3000年 2019-04-22
  • 262| 828| 788| 743| 990| 689| 531| 272| 30| 202|