最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

全球短讯!.NET 5 以后的 HttpClient 超时问题

来源:博客园


(相关资料图)

背景

起因是朋友在使用深信服的 Easy Connect 连接到内网之后,使用 HttpClient访问对应内网的 API 站点均返回 System.Net.Sockets.SocketException (10060)异常。但使用其他语言的原生 HTTP 库,比如 Golang / Python / Java 都可以正常访问,因此怀疑是 HttpClient的问题。

原因

经过搜索得知,这是存在于 .NET 5 及其以上版本的问题,在 .NET 3.1 是不存在这种情况的。底层原因是从 .NET 5 开始,HttpClient的底层实现使用的是双栈套接字(Dual-Stack Sockets),在某些情况下,你的网卡获得了 IPv6 地址,但是 VPN 处于某种原因不能正确地处理 IPv6 请求时就会导致上述情况的发生。在 PR #55012 中,说明了这种情况:

Introduces an AppContext switch System.Net.DisableIPv6and environment variable DOTNET_SYSTEM_NET_DISABLEIPV6to emulate the lack of OS-level IPv6 support. This is useful to workaround dual-stack socket issues when the OS reports support of IPv6, but some other underlying infrastructure element (typically VPN) doesn"t function well with IPv6 request.

For consistency, this switch also impacts NameResolution and Ping, not only Sockets.

解决

根据 PR 提到的信息,我们只需要在程序启动的时候使用以下代码禁用 IPv6 栈即可解决。

AppContext.SetSwitch("System.Net.DisableIPv6",true);

相关 Issue / PR:

  • https://github.com/dotnet/runtime/issues/47267
  • https://github.com/dotnet/runtime/issues/52287
  • https://github.com/dotnet/runtime/issues/44686
  • https://github.com/dotnet/runtime/commit/067aa165d97372f3e281786801d014fccea8b12c

关键词: