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 中,您必须通过 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 内存泄漏
如何在 .NET Core 中使用 HttpClientHandler 和 HttpClientFactory
TestServer CreateClient 和 HttpClientHandler - 如何?