HttpClientHandler不包含DefaultProxyCredentials的定义

时间:2019-09-03 12:45:16

标签: c# .net .net-core dotnet-httpclient

我正在使用以下代码从使用.Net Core 2.0的API获取数据。

        using (var handler = new HttpClientHandler() { DefaultProxyCredentials = CredentialCache.DefaultCredentials })
        {
            handler.PreAuthenticate = true;
            using (var client = new HttpClient(handler))
            {
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
                var response = await client.GetAsync(url);
            }
        }

但是,我需要将项目转换为.Net Framework 4.6.1,并且.Net Framework 4.6.1中没有DefaultProxyCredentials属性。

https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclienthandler.defaultproxycredentials

.Net Framework 4.6.1(不使用配置文件)中的DefaultProxyCredentials等效于什么?

更新:我尝试将代码更改为以下内容:

using (var handler = new HttpClientHandler() { Proxy = WebRequest.DefaultWebProxy})
{
}

它可以工作,但会随机抛出407-“需要代理身份验证”错误。

2 个答案:

答案 0 :(得分:5)

为什么要定位4.6而不是4.7.2?这很重要,并且可能导致NuGet依赖地狱。


您似乎正在使用4.6中包含的(非常)旧的HttpClient类,而不是System.Net.Http包。那个旧的实现甚至没有使用新的套接字处理程序。 HttpClientHandler.DefaultProxyCredentials属性是在.NET 4.7.1中添加的。

  • 最好的选择可能是针对最新的.NET版本,或者至少是4.7.1,并使用与现在相同的代码。更好的是,将目标定为4.7.2,以避免在下一个选项中说明的依赖项。
  • 您可以只添加软件包。它与.NET Core项目中使用的.NET Standard 2.0软件包相同。缺点是4.6.1确实不是 .NET Standard 2.0兼容的,并且需要几个兼容性库。由于版本相互冲突,升级很容易导致依赖地狱。 .NET团队admitted that trying to retrofit .NET Standard 2.0 compliance was a bad idea
  

虽然NuGet认为.NET Framework 4.6.1支持.NET Standard 1.5至2.0,但是使用为.NET Framework 4.6.1项目中的那些版本构建的.NET Standard库存在一些问题。对于需要使用此类库的.NET Framework项目,建议您将项目升级到目标.NET Framework 4.7.2或更高版本。

在那里。有生产崩溃报告来证明这一点。以及删除以前所有垫片以消除版本冲突的高级1天升级体验。确实Several issues

  • 使用
  • 设置默认代理的Credentials属性
    WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

答案 1 :(得分:0)

HttpClientHandler中有一个名为Credentials的ICredentials接口。所以:

using (var handler = new HttpClientHandler() 
{ Credentials = CredentialCache.DefaultCredentials }) {}