【问题标题】:NO_PROXY ignored by .NET Core 3.0 on WindowsNO_PROXY 在 Windows 上被 .NET Core 3.0 忽略
【发布时间】:2020-06-30 14:36:24
【问题描述】:

我们正在尝试让代理功能在 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

我明白了:

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

我希望得到空白和真实。

我应该进行哪些更改才能使用 NO_PROXY 从默认代理中排除域?

【问题讨论】:

标签: c# dotnet-httpclient http-proxy .net-core-3.0


【解决方案1】:

我拉取了 System.Net.Http.HttpEnvironmentProxyin .NET Core 3.1(和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

然后我得到:

https://www.contoso.com/ 的目标代理是 http://10.11.10.10/ True

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

【讨论】:

  • 如果可以的话,我会投票 1000 次!您在 ASP.NET Core HttpEnvironmentProxy 代码中的发现是解决所有问题的关键。我们的默认内部配置在 NO_PROXY 列表中使用 *(通配符)。事实证明,尽管在 NO_PROXY 中列出了 ASP.NET Core 3.1 及更高版本,但仍通过代理错误路由请求的原因。 .EndsWith()HttpEnvironmentProxy.cs 第 246 行的电话是解开整个谜团的关键。
  • 我相信这应该被标记为接受。感谢您的研究!我编辑了答案以澄清一点,并添加了一个指向当前代码的链接,以便答案即使在 .NET Core 3.1 之后也能保持相关性。我总结了编辑描述中的变化。
【解决方案2】:

no_proxy 中从来没有“标准”。在 Linux 中,大多数应用程序将其识别为小写字母。当然,在 Windows 中,它始终不区分大小写。但是当涉及到通配符匹配或正则表达式匹配时,根本没有标准。对于 no_proxy,每个应用程序都以自己认为合适的方式工作。

【讨论】:

    猜你喜欢
    • 2021-05-11
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多