以下代码采用目标 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) ...