我有一个必须与几种不同服务进行通信的Web API。目前,我将Web API设置为使用以下安全协议:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
当API通过HttpClient
(例如Twitter)呼叫其他服务时,它将使用该协议。然而,与此同时,另一个请求可能会从云访问某些内容,无论出于何种原因,目前需要TLS(而不是TLS 1.2)。在发出之前,对云的请求再次设置安全协议:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
我遇到的问题是当两个独立且唯一的请求进入时,一个用于Twitter,一个用于云,安全协议可能在发送之前切换到“错误的”,导致请求失败。
有没有办法在每个请求HttpClient
上设置安全协议,这样我就不会在某个地方的某个单独设置中进行交换?
答案 0 :(得分:11)
您不需要设置它。
您可以使用:
using System.Net;
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;
附加说明:
答案 1 :(得分:4)
似乎没有办法做到这一点。 SecurityProtocol
属性仅在一个位置内部TlsStream
类中使用:
TlsStream
似乎支持所有内部TLS连接,例如HTTP,FTP和SMTP。
我原本希望ServicePoint
允许你配置它。对于许多设置ServicePointManager
仅提供默认设置。这种希望没有根据。
所以这是非常有力的证据,证明这是不可能的。但是,它没有证据。
你应该怎么做?我为您正在与之通话的奇怪服务器切换出HTTP客户端库。 HTTP不是一个特别复杂的协议。我确定还有其他一些可用的实施方案。
或者,使用代理终止您自己服务器上的HTTPS连接。 .NET然后只处理HTTP。