.NET6/.NET Core HttpClient在Linux下未遵循子域名no_proxy设置
问题表现
- 部署在企业内网Linux环境的多台ASP.NET Core服务需要互相通信,宿主机已提前配置
http_proxy、no_proxy全局环境变量 - 服务间通过
HttpClient发起内网请求时持续返回504 Gateway错误,链路追踪确认请求未直连目标内网服务,而是被转发到了配置的代理网关
根因说明
Linux平台下.NET 6、.NET Core版本的HttpClient内置代理规则匹配逻辑存在缺陷:无法正确识别no_proxy配置中的子域名通配规则,导致符合内网直连要求的请求未遵循no_proxy设置,错误走代理链路最终请求失败。
可行修复方案
- 显式配置HttpClient代理绕过规则
服务注册HttpClient时手动指定代理配置与绕过列表,不依赖运行时默认的环境变量解析逻辑,参考实现:services.AddHttpClient("InternalApiClient") .ConfigurePrimaryHttpMessageHandler(() => { var proxyAddress = Environment.GetEnvironmentVariable("http_proxy"); var proxy = new WebProxy(new Uri(proxyAddress)) { BypassProxyOnLocal = true, // 按实际内网地址段、域名后缀配置绕过规则 BypassList = new string[] { "*.intra.corp", "10.*", "172.16.*", "192.168.*" } }; return new HttpClientHandler { Proxy = proxy, UseProxy = true }; }); - 调整no_proxy环境变量写法
将no_proxy中带前缀.的域名规则修改为无前缀格式,例如将原规则.intra.corp改为intra.corp,该格式可被.NET 6/.NET Core的默认匹配逻辑正确识别,自动覆盖所有子域名的直连规则。 - 升级运行时版本
升级服务运行时到.NET 7及以上版本,该版本已修复Linux平台下no_proxy子域名匹配的已知问题,无需额外代码配置即可正确遵循系统代理规则。
注意:无论采用哪种方案,修改配置后都需要完整重启ASP.NET Core进程,代理相关环境变量仅在进程启动时加载一次,运行时修改不会动态生效。
内容的提问来源于stack exchange,提问作者csnemes
相关产品推荐
相关产品推荐

