You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:15:18