Windows 上的 .net core 3.0 忽略了 NO_PROXY

Pro*_*gle 4 c# http-proxy dotnet-httpclient .net-core-3.0

我们正在尝试让代理功能在 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)}");
Run Code Online (Sandbox Code Playgroud)

如果我从 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
Run Code Online (Sandbox Code Playgroud)

我得到:https://www.contoso.com/ 的目标代理是http://10.11.10.10/ False

我希望得到空白和真实。

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

Pro*_*gle 5

我提取了 .Net Core 3.1 System.Net.Http.HttpEnvironmentProxy的代码并通读了它。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
Run Code Online (Sandbox Code Playgroud)

然后我得到:https://www.contoso.com/ 的目标代理是http://10.11.10.10/ True

大概 DefaultProxy 逻辑将使用 IsBypassed 结果为 true 来停止 NO_PROXY 列表上的代理。

  • 如果可以的话,我会投票 1,000 次!您在 ASP.NET Core HttpEnvironmentProxy 代码中的发现是解决所有问题的关键。我们的默认内部配置在 NO_PROXY 列表中使用 *(通配符)。这就是为什么 ASP.NET Core 3.1 及更高版本尽管已在 NO_PROXY 中列出,但仍通过代理错误路由请求的根源。“HttpEnvironmentProxy.cs”第 246 行的“.EndsWith()”调用是解开整个谜团的关键。 (2认同)