在 .NET Core 中获取系统默认 Web 代理



以下代码采用目标 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中获取默认Web代理的地址?

好吧,我不知道我几周前尝试时错过了什么。我又试了一次,一切似乎都很好。

使用CredentialCache.DefaultCredentials,此短代码适用于:.NET和.NET Core。

var targetUri = new Uri("...");
var handler = new HttpClientHandler();
handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials;
var client = new HttpClient(handler, disposeHandler: true);
await client.GetStreamAsync(targetUri) ...

最新更新