Mår*_*röm 5 c# ssl http azure-application-insights .net-core
我在发布的遥测数据到应用程序洞察数据采集终端https://dc.services.visualstudio.com/v2/track使用HttpClient。
使用.NET Core 2.0时,此方法工作正常。但是,升级到.NET Core 2.1之后,所有请求都将失败,并显示HTTP状态500 Internal Server Error和如下所示的HTML响应正文:
(这是一个IIS 8.5详细错误页面)
在.NET Core 2.1中,他们更改了HttpClientHandler工作方式,并添加了一个AppContext允许我们保留旧行为的开关:
AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
Run Code Online (Sandbox Code Playgroud)
确实,设置此开关可以解决问题!
但我想避免使用该开关:
HttpClientHandler实例的行为。不只是我用来将数据发布到Application Insights端点的那个。我试图通过使用Wireshark查看流量来找出导致此问题的原因。试图以这种低水平解释HTTPS流量超出了我的范围。我在TLS握手中确实发现了一些可疑的东西。
这两个SocketsHttpHandler(即不工作)和传统WinHttpHandler(即做的工作)使用TLS 1.2。但是,仅WinHttpHandler使用TLS证书状态请求扩展名。这可能是请求失败的原因吗?
在任何情况下,都将建立TLS连接,发送请求并检索响应。在处理请求时,服务器端显然存在错误。
我想找出导致此问题的原因。任何帮助表示赞赏!
正如@mjwills所建议的那样,我更改了代码,使其使用HTTP(而非SSL)并将其发布到允许我捕获请求的本地程序中。(我没有弄清楚如何在Wireshark中以干净的方式执行此操作,因此我最终基于编写了自己的小捕获工具TcpListener):
使用新版本时捕获SocketsHttpHandler:
POST / HTTP/1.1
Transfer-Encoding: chunked
Content-Type: application/x-json-stream
Content-Encoding: gzip
Host: localhost:12345
A
[...10 bytes of data...]
F4
[...244 bytes of data...]
0
Run Code Online (Sandbox Code Playgroud)
使用旧版时捕获WinHttpHandler:
POST / HTTP/1.1
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/x-json-stream
Content-Encoding: gzip
Host: localhost:12345
a
[...10 bytes of data...]
f4
[...244 bytes of data...]
0
Run Code Online (Sandbox Code Playgroud)
这些是差异:
WinHttpHandler想要保持连接活跃,而SocketsHttpHandler没有。
WinHttpHandler使用小写的十六进制表示块的长度,而SocketsHttpHandler使用大写的。
前10个字节包含gzip标头。其余的244个字节包含gzip编码的json遥测数据。
| 归档时间: |
|
| 查看次数: |
310 次 |
| 最近记录: |