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

.Net 6.0 Ubuntu下HttpClient HTTPS请求报OpenSSL refcount error问题

解决Ubuntu 20.04 + .NET 6下HTTPS请求的OpenSSL refcount error问题

问题场景

在Ubuntu 20.04的.NET 6环境中,执行HTTPS请求时触发OpenSSL internal error: refcount error导致崩溃,但HTTP请求可正常执行,Windows系统下无此异常。

核心原因

  1. OpenSSL版本兼容性缺陷
    Ubuntu 20.04默认搭载的OpenSSL 1.1.1f存在引用计数管理的线程安全bug,而.NET 6在Linux平台依赖系统OpenSSL库处理HTTPS加密,当.NET的异步请求逻辑与该版本OpenSSL的资源管理逻辑冲突时,就会触发引用计数错误。

  2. 同步阻塞异步代码的风险
    使用.GetAwaiter().GetResult()同步阻塞异步的GetAsync方法,会打乱.NET的线程调度逻辑,在Linux线程池环境下,这种阻塞行为可能导致OpenSSL资源无法被正确释放,进而引发引用计数异常。

解决措施

1. 升级OpenSSL版本

OpenSSL 1.1.1n及以上版本修复了相关引用计数bug,执行以下命令升级系统OpenSSL:

sudo apt update
sudo apt install --only-upgrade openssl libssl1.1

升级完成后重启应用,重试HTTPS请求。

2. 改用纯异步代码写法

避免同步阻塞异步方法,全程使用await调用:

async Task SendHttpsRequest()
{
    using HttpClient client = new HttpClient();
    var response = await client.GetAsync("https://www.google.com");
    // 后续响应处理逻辑
}

异步调度能保证.NET线程池和OpenSSL资源管理的兼容性,避免引用计数异常。

3. 临时切换HTTP Handler(不推荐长期使用)

如果升级OpenSSL不可行,可通过环境变量切换到旧版HTTP Handler作为临时 workaround:

# 启动应用前设置环境变量
export DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER=0

或在代码中提前设置:

Environment.SetEnvironmentVariable("DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER", "0");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:32:47