背景
起因是朋友在使用深信服的 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.DisableIPv6
and environment variableDOTNET_SYSTEM_NET_DISABLEIPV6
to 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 栈即可解决。文章来源:https://www.toymoban.com/news/detail-480384.html
AppContext.SetSwitch("System.Net.DisableIPv6",true);
相关 Issue / PR:文章来源地址https://www.toymoban.com/news/detail-480384.html
- 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
到了这里,关于.NET 5 以后的 HttpClient 超时问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!