每个请求更改安全协议(HttpClient)

时间:2015-01-14 22:32:24

标签: c# http ssl asp.net-web-api

我有一个必须与几种不同服务进行通信的Web API。目前,我将Web API设置为使用以下安全协议:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

当API通过HttpClient(例如Twitter)呼叫其他服务时,它将使用该协议。然而,与此同时,另一个请求可能会从云访问某些内容,无论出于何种原因,目前需要TLS(而不是TLS 1.2)。在发出之前,对云的请求再次设置安全协议:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

我遇到的问题是当两个独立且唯一的请求进入时,一个用于Twitter,一个用于云,安全协议可能在发送之前切换到“错误的”,导致请求失败。

有没有办法在每个请求HttpClient上设置安全协议,这样我就不会在某个地方的某个单独设置中进行交换?

2 个答案:

答案 0 :(得分:11)

您不需要设置它。

您可以使用:

using System.Net;
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;

附加说明:

  • .Net 4.5需要,因为Tls12不是默认协议。
  • 只需在应用程序中编写一次上述代码。 (例如,在Global.asax> Web应用程序中的Application_Start或Winforms应用程序中的等效项)
  • 对于.Net 4.6及以上版本,Tls12是默认协议,因此不需要

答案 1 :(得分:4)

似乎没有办法做到这一点。 SecurityProtocol属性仅在一个位置内部TlsStream类中使用:

enter image description here

TlsStream似乎支持所有内部TLS连接,例如HTTP,FTP和SMTP。

我原本希望ServicePoint允许你配置它。对于许多设置ServicePointManager仅提供默认设置。这种希望没有根据。

所以这是非常有力的证据,证明这是不可能的。但是,它没有证据。

你应该怎么做?我为您正在与之通话的奇怪服务器切换出HTTP客户端库。 HTTP不是一个特别复杂的协议。我确定还有其他一些可用的实施方案。

或者,使用代理终止您自己服务器上的HTTPS连接。 .NET然后只处理HTTP。