HttpClientHandler 不包含 DefaultProxyCredentials 的定义

HttpClientHandler does not contain a definition for DefaultProxyCredentials

我正在使用以下代码从使用 .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 - "Proxy Authentication Required" 错误。

为什么您的目标是 4.6 而不是 4.7.2?这很重要,可能会导致 NuGet 依赖地狱。


看起来您使用的是 4.6 中包含的(非常)旧的 HttpClient class 而不是 .NET 4.7.1 中添加的 System.Net.Http package. That old implementation doesn't even use the new socket handler. The HttpClientHandler.DefaultProxyCredentials 属性。

  • 最好的选择可能是针对最新的 .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

While NuGet considers .NET Framework 4.6.1 as supporting .NET Standard 1.5 through 2.0, there are several issues with consuming .NET Standard libraries that were built for those versions from .NET Framework 4.6.1 projects. For .NET Framework projects that need to use such libraries, we recommend that you upgrade the project to target .NET Framework 4.7.2 or higher.

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

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

在HttpClientHandler 中有一个ICredentials 接口,叫做Credentials。所以:

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