NO_PROXY 在 Windows 上被 .NET Core 3.0 忽略

NO_PROXY ignored by .NET Core 3.0 on Windows

我们正在尝试让代理功能在 Windows 上的 .NET Core 3.0(或 3.1)应用程序中运行。我们发现 HTTPS_PROXY 和 HTTP_PROXY 变量按预期被识别和处理,但默认代理似乎不支持 NO_PROXY 变量。这是示例代码:

 HttpClient client = new HttpClient();
 IWebProxy myProxy = HttpClient.DefaultProxy;
 Uri target = new Uri(args[0]);
 Uri proxy = myProxy.GetProxy(target);
 Console.WriteLine($"Target proxy for {target} is {proxy} {myProxy.IsBypassed(target)}");

如果我从 PowerShell 中 运行 这样:

if (-not $env:path.Contains('c:\data\src')) {
    $env:path = "$env:Path;C:\data\src\Local\DefaultProxy\bin\Debug\netcoreapp3.0"
}
$env:HTTPS_PROXY = 'http://10.11.10.10'
$env:NO_PROXY = '*'
DefaultProxy https://www.contoso.com

我得到:

Target proxy for https://www.contoso.com/ is http://10.11.10.10/ False

我希望得到空白和真实。

我应该更改什么才能使用 NO_PROXY 从默认代理中排除域?

我提取了 System.Net.Http.HttpEnvironmentProxy in .NET Core 3.1 (and in latest main development branch) 的代码并通读了它,主要是通过 IsMatchInBypassList 方法。 NO_PROXY 中不支持星号 (*) 等通配符,因此这根本不起作用。此外,对 GetProxy 的调用完全忽略了 NO_PROXY 值。

要实现“通配符”行为,NO_PROXY 列表中的域需要以点 (.) 为前缀,这是标准的,但没有特别详细的记录。我可以使用这些信息来改变我对文档的解释并获得更好的结果。

所以,如果我修改 PowerShell 代码如下:

$env:HTTPS_PROXY = 'http://10.11.10.10'
$env:NO_PROXY = '.contoso.com'
DefaultProxy https://www.contoso.com

然后我得到:

Target proxy for https://www.contoso.com/ is http://10.11.10.10/ True

据推测,DefaultProxy 逻辑将使用 IsBypassed 结果为 true 来停止 NO_PROXY 列表上的代理。

no_proxy 从来没有“标准”。在 Linux 中,大多数应用程序将其识别为 lower_case。当然,在 Windows 中,它始终不区分大小写。但是说到通配符匹配或者正则表达式匹配,根本就没有标准可言。 no_proxy.

每个应用程序都按照自己认为合适的方式工作