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

.NET 8.0.6在Garuda Linux下出站连接超时问题求助

.NET 8.0.6 在 Garuda Linux 下出站连接持续超时排查方案

问题背景

  • 系统:基于Arch的Garuda Linux(全新重装,未部署Docker,默认防火墙配置)
  • .NET版本:8.0.6
  • 开发工具:JetBrains Rider
  • 核心现象:
    • HttpClient发起的HTTP/HTTPS请求均超时(抛出TaskCanceledException),ASP.NET启动序列、独立控制台应用中均复现
    • 非HTTPS地址同样失败,仅超时无连接拒绝提示
    • 生产服务器上代码正常运行,本地curl命令可正常访问目标地址
    • 已尝试操作:重装系统、手动设置SecurityProtocol为Tls12、wtrace跟踪(仅发现无关的程序集加载错误,请求阶段无有效线索)

测试代码示例

var website = "https://perdu.com";
Console.WriteLine($"Querying {website}...");
using var client = new HttpClient();
client.Timeout = TimeSpan.FromSeconds(5);
var value = await client.GetStringAsync(website);
Console.WriteLine(value);

排查步骤

  1. 强制禁用.NET代理配置
    即使系统无代理设置,可能.NET残留了旧配置,可在代码中强制关闭代理:

    using var handler = new HttpClientHandler
    {
        UseProxy = false
    };
    using var client = new HttpClient(handler);
    

    运行代码验证是否恢复正常。

  2. 验证DNS解析一致性
    在代码中手动解析域名,对比系统工具的解析结果:

    var ipAddresses = await Dns.GetHostAddressesAsync("perdu.com");
    foreach (var ip in ipAddresses)
    {
        Console.WriteLine($"Resolved IP: {ip}");
    }
    

    同时执行nslookup perdu.com或dig perdu.com,若.NET解析结果与系统不一致,检查/etc/resolv.conf是否被.NET覆盖,可尝试显式指定DNS服务器:

    var dnsEndPoint = new DnsEndPoint("8.8.8.8", 53);
    var ipAddresses = await Dns.GetHostAddressesAsync("perdu.com", dnsEndPoint);
    
  3. 修复TLS/SSL证书与协议配置

    • 显式指定所有支持的TLS版本:
      System.Net.ServicePointManager.SecurityProtocol = 
          SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13;
      
    • 确认.NET使用系统CA证书池,设置环境变量后再运行程序:
      export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
      dotnet run
      
  4. 跟踪系统级网络调用
    用strace查看程序网络调用的具体阶段,定位超时环节:

    strace -f -e trace=network dotnet run
    

    重点关注connect、sendto、recvfrom等调用的返回值,判断是连接建立超时还是数据接收超时。

  5. 重新安装.NET运行时
    排查.NET运行时是否损坏,执行重装:

    sudo pacman -R dotnet-runtime dotnet-sdk
    sudo pacman -S dotnet-runtime dotnet-sdk
    

    验证安装完整性:dotnet --info,确认版本和依赖路径正常。

  6. 切换HTTP客户端实现测试
    用HttpWebRequest替代HttpClient,判断问题是否局限于HttpClient:

    var request = (HttpWebRequest)WebRequest.Create("https://perdu.com");
    request.Timeout = 5000;
    using var response = (HttpWebResponse)request.GetResponse();
    using var reader = new StreamReader(response.GetResponseStream());
    Console.WriteLine(reader.ReadToEnd());
    

内容的提问来源于stack exchange,提问作者Etienne Charland

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:58:31