【发布时间】:2019-12-15 12:14:31
【问题描述】:
以下代码采用目标 uri 并将其内容作为流获取。在进行网络调用之前,它会检查是否需要代理来访问目标 uri。
这非常适用于全框架(即 v4.8)中的 .NET 应用程序:
var targetUri = new Uri("...");
HttpClient client;
// get the system default web proxy ...
var proxyUri = WebRequest.DefaultWebProxy.GetProxy(targetUri);
// ... and check whether it should be used or not
var proxyAuthorityEqualsTargetAuthority = proxyUri?.Authority?.Equals(targetUri.Authority) == true;
var proxyRequired = !proxyAuthorityEqualsTargetAuthority;
if (proxyRequired)
{
var proxy = new WebProxy()
{
Address = proxyUri,
BypassProxyOnLocal = false,
UseDefaultCredentials = true
};
var httpClientHandler = new HttpClientHandler { Proxy = proxy };
client = new HttpClient(handler: httpClientHandler, disposeHandler: true);
}
else
{
client = new HttpClient();
}
await client.GetStreamAsync(targetUri) ...
但它在 .NET Core 应用程序中不起作用:
访问WebRequest.DefaultWebProxy.GetProxy(targetUri) 将抛出PlatformNotSupportedException:
此平台不支持操作。
所以我尝试了这一行,它也受 .NET Core 支持:
// deprecated: var proxyUri = new Uri(WebRequest.DefaultWebProxy.GetProxy(targetUri).AbsoluteUri);
var proxyUri = new WebProxy().GetProxy(targetUri);
但是,返回的 proxyUri.Authority 现在总是返回 targetUri(在 .NET 和 .NET Core 中),而不是像 WebRequest.DefaultWebProxy.GetProxy(targetUri) 在 .NET 中那样返回代理服务器的地址。
这样,proxyAuthorityEqualsTargetAuthority 始终为真,因此,proxyRequired 始终为假。直接访问目标uri会抛出407 (Proxy Authentication Required)。
有谁知道如何获取.NET Core 中默认网络代理的地址?
【问题讨论】: