Windows平台下.NET HTTP请求耗时过长问题排查求助
Windows平台.NET HttpClient请求特定域名耗时43秒的排查方案
问题代码
public async Task<AccountInfo> GetMyAccountInfoAsync() { var token = await auth.GetIdTokenAsync(false); using var req = new HttpRequestMessage( HttpMethod.Get, "https://my-company-domain.com/api/protected"); req.Headers.Add("Authorization", "Bearer " + token); var http = new HttpClient(); using var res = await http.SendAsync(req); // 此处耗时约43秒 res.EnsureSuccessStatusCode(); // 无关代码 }
问题现象
- 上述代码在Windows平台调用公司域名接口时,耗时固定约43秒,但请求
https://example.com等公共域名速度正常 - 请求最终能返回200 OK及预期响应体
- Android、iOS平台无此问题
已尝试的无效方案
- 使用全新HttpClient实例或依赖注入提供的共享单实例
- 用curl执行相同请求仅需约1秒,排除服务器端问题
- 将代码包裹在
Task.Run中执行,问题依旧
更新信息
- 曾怀疑ISP问题,但使用VPN后问题消失,却无法解释curl请求正常的情况;类似案例中,.NET相关工具(如
dotnet nuget)异常但独立工具(nuget.exe)正常 - 在新建控制台应用中运行相同代码仍出现相同耗时问题,确认是Windows平台的.NET相关问题
- 本地DNS设置为Cloudflare 1.1.1.1并开启DNS over TLS,不确定.NET是否使用该配置
- 在耗时阶段中断调试捕获到相关调用栈
- PowerShell中使用HttpClient执行请求也出现相同耗时问题,确认是系统级问题:
$http = New-Object System.Net.Http.HttpClient $http.GetStringAsync("https://company-domain.com/api/protected").GetAwaiter().GetResult()
排查方向
1. 验证DNS解析优先级与结果
- .NET在Windows下可能优先尝试IPv6解析,若服务器IPv6地址不可达会导致超时。可强制HttpClient使用IPv4:
// 方案1:修改配置文件强制禁用IPv6 // 在App.config/web.config中添加 // <system.net> // <settings> // <ipv6 enabled="false"/> // </settings> // </system.net> // 方案2:代码中指定IPv4地址测试 var req = new HttpRequestMessage(HttpMethod.Get, "https://[服务器IPv4地址]/api/protected"); req.Headers.Host = "my-company-domain.com"; // 必须指定Host头,否则服务器无法识别 - 用
nslookup my-company-domain.com和Resolve-DnsName my-company-domain.com对比系统解析结果,看是否返回不可用的IPv6地址
2. 检查TLS/SSL协议兼容性
- curl与.NET默认使用的TLS版本可能不同,强制指定兼容的TLS版本:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13; - 用Wireshark抓包,对比curl和.NET请求的TLS握手过程,查看是否有协商超时或重试行为
3. 排查WinHTTP与代理配置差异
- .NET的HttpClient在Windows下依赖WinHTTP,而curl可能使用不同的网络栈。执行
netsh winhttp show proxy查看WinHTTP代理设置,对比IE的代理配置(通过inetcpl.cpl打开) - 尝试在HttpClient中显式禁用代理:
var handler = new HttpClientHandler { UseProxy = false }; var http = new HttpClient(handler);
4. 清空DNS缓存并验证解析策略
- 清空系统DNS缓存:
ipconfig /flushdns,同时设置.NET的DNS刷新超时:ServicePointManager.DnsRefreshTimeout = 0; // 禁用DNS缓存,每次请求重新解析 - 直接使用服务器IP地址请求,若速度恢复则确认是DNS解析问题
5. 检查Windows网络组件状态
- 重启
Http.sys服务:执行net stop http && net start http(注意此操作会影响IIS等依赖服务) - 更新.NET框架/.NET SDK到最新稳定版本,排查是否存在已知的网络组件BUG
内容的提问来源于stack exchange,提问作者Luke Vo
相关产品推荐
相关产品推荐

