Httpclient在.net core3.1上成功运行,但更新到.net 5中连接超时(System.Net.Sockets.SocketException (10060)) C#
前言:
项目本来是在.net core 3.0 版本上跑然后看了看现在都到5.0马上6.0了想着升级一下体验一下新版本的高性能(狗头)然后在测试的时候发现项目里一些请求外部API出现大批请求超时错误如下。没想到刚升级就出岔子了,使用同样的代码在本地运行,环境一致的情况下,将SDK换成.net core 3.0 请求正常,切换到5.0时就开始请求连接超时,没办法先百度看看有没有病友,结果发现就我一个病友,哎,本来有的话就不想发了 ,但是看到没有有用的结果,我还是把我搜索到的一些结果分享给广大病友,希望能有一点帮助把!
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1] An unhandled exception has occurred while executing the request. System.Net.Http.HttpRequestException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. (api.map.baidu.com:80) ---> System.Net.Sockets.SocketException (10060): A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken) at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token) at System.Net.Sockets.Socket.<ConnectAsync>g__WaitForConnectWithCancellation|283_0(AwaitableSocketAsyncEventArgs saea, ValueTask connectTask, CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.DefaultConnectAsync(SocketsHttpConnectionContext context, CancellationToken cancellationToken) at System.Net.Http.ConnectHelper.ConnectAsync(Func`3 callback, DnsEndPoint endPoint, HttpRequestMessage requestMessage, CancellationToken cancellationToken) --- End of inner exception stack trace ---
回归正言,通过错误我们可以发现是在连接上出现了问题,那么最有可能就是tcp握手期间没有得到任何响应,然后我又对我本地端口进行查看,发现都是正常的没有问题,然后在github的.net rutime 项目的Issues中发现这个问题还是有很多人出现的。在查看了一些回复后可以确定问题是由于.net 5中切换到了双协议栈,TcpClient将默认为IPV6,这意味这IPV6将用于IPV4和IPV6的请求,这个时候如果你的客户端或者网络不支持IPV6或双协议栈,连接将会出现超时。 ==>Httpclient perfectly work on 3.1 but timeout in .net 5
IPv6 测试 (test-ipv6.com) 这个网址可以测试你当前网络是否支持IPV6连接,这个测试结果似乎没什么用,后来我回家测试也发现显示的也是同样的报告,但是在家使用同样的代码连接都没问题,那么最有可能是公司vpn网络的原因。
解决方案和后续
(下方截图原地址 https://github.com/dotnet/runtime/issues/44686 )
这个问题的解决方案,net runtime团队给出了原因和建议,大概的意思根本原因是由于3.0升级到5.0之后,HttpClient使用双栈套接字所造成的
相关代码
同时此问题已经添加到.net 6.0 里程碑(https://github.com/dotnet/runtime/issues/47267)中希望在6.0能够完美解决这个问题。
一个系统最重要的还是稳定性,不能一味的追求新版本和高性能,还好是在本地测试的时候就发现了不然代码和人总得跑一个(狗头保命),病友们,稳住别浪!!!。
不怎么会写文章如果当中有错误也欢迎大家指正!最后老老实实把5.0切换到3.0,等到6.0在看看把。
相同问题
https://github.com/dotnet/runtime/issues/52287
https://github.com/dotnet/runtime/issues/47267
https://github.com/dotnet/runtime/issues/47583
关于httpclient HttpClient 连接池在.NET核心-史蒂夫戈登-代码与史蒂夫 (stevejgordon.co.uk)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构