HttpClientHandler 抛出 PlatformNotSupportedException

Posted

技术标签:

【中文标题】HttpClientHandler 抛出 PlatformNotSupportedException【英文标题】:HttpClientHandler throwing PlatformNotSupportedException 【发布时间】:2017-09-25 08:32:58 【问题描述】:

以下代码抛出“PlatformNotSupportedException”'此平台不支持操作”

它是一个 .NET 4.6.1 项目引用的 NET 标准库(尝试针对 1.4 和 2.0 进行编译),该项目作为 Web 应用程序运行。

var handler = new HttpClientHandler();
handler.SslProtocols = SslProtocols.Tls12;

为什么 Tls12 会抛出此异常,有什么解决方法?

【问题讨论】:

尝试设置Proxy = null,在这里找到github.com/dotnet/corefx/issues/12282 @JericCruz:他不运行 .NET Core,他在 .NET Framework 4.6.1 上运行。 .NET Framework 的 HttpClientHandler 类中不存在该属性。 dotnet/corefx 存储库显然是用于 .NET Core 运行时的。 【参考方案1】:

这里的问题是SslProtocols属性在.NET Framework中不存在,它只存在于.NET Core中。

您可以在HttpClientHandler 的文档中看到这一点。

.NET Framework .NET Core

在 .NET Framework 中,您必须通过 ServicePointManager.SecurityProtocol 设置它,即

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11;

要在您的 .NET Standard PCL 中实现这一点,您很可能必须交叉编译到 netstandard-2.0 net461,因为我不确定它是否仍然存在于 .NET Standard /.NET 核心。

编辑:

或者,将其从 PCL 中删除,并通过上面的静态属性在 .NET Framework 应用程序中全局设置。

【讨论】:

好吧,这似乎向我解释了一些事情。我以为我的主要应用程序是 netcore,但它仍然针对 4.6.1,因为某些软件包不兼容。所以我使用 net 标准库做出了错误的选择,我应该继续使用旧的 4.6 包,直到主 Web 应用程序针对 netcore 编译。通过使用旧的非网络核心包,我不会有这个错误。【参考方案2】:

根据Microsoft docs,该属性本应使用 .NET 4.7.1 实现,并且实际上已在.NET 4.7.2. 上实现和工作

【讨论】:

以上是关于HttpClientHandler 抛出 PlatformNotSupportedException的主要内容,如果未能解决你的问题,请参考以下文章

HttpClientHandler / HttpClient 内存泄漏

多个 HttpClientHandler 实例超时错误

如何在 .NET Core 中使用 HttpClientHandler 和 HttpClientFactory

TestServer CreateClient 和 HttpClientHandler - 如何?

HttpClientHandler / 请求被中止:无法创建 SSL/TLS 安全通道

HttpClient 和 HttpClientHandler 是不是必须在请求之间进行处理? [关闭]