[英]Get system default web proxy in .NET Core
以下代碼采用目標 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核心),而不是地址,如代理服務器WebRequest.DefaultWebProxy.GetProxy(targetUri)
確實在.NET。
這樣, proxyAuthorityEqualsTargetAuthority
始終為真,因此, proxyRequired
始終為假。 直接訪問目標 uri 會拋出407 (Proxy Authentication Required)
。
好吧,我不知道我錯過了,因為我試過這個星期前。 我再次嘗試,一切似乎都很好。
使用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) ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.