Изменение протокола безопасности для каждого запроса (HttpClient)

У меня есть веб-API, который должен общаться с несколькими различными службами. В настоящее время у меня установлен API Web API для использования следующего протокола безопасности:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Когда API вызывает другую службу через HttpClient (например, Twitter), он будет использовать этот протокол. В то же время, однако, может потребоваться другой запрос, чтобы получить доступ к чему-либо из облака, который по какой-то причине требует TLS (а не TLS 1.2). Запрос на облако перед запуском снова устанавливает протокол безопасности:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

Проблема, с которой я сталкиваюсь, - это когда появляются два отдельных и уникальных запроса: один для Twitter и один для облака, протокол безопасности может переключиться на "неправильный" до его отправки, в результате чего запрос потерпеть неудачу.

Есть ли способ установить протокол безопасности в HttpClient для каждого запроса, чтобы я не заменял параметр в каком-то синглетоне где-нибудь?

Ответ 1

Вам не нужно устанавливать это.

Ты можешь использовать:

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

Дополнительные примечания:

  • Необходим для .Net 4.5, потому что Tls12 не является протоколом по умолчанию.
  • Нужно написать вышеуказанный код только один раз в приложении. (Например, в Global.asax> Application_Start в веб-приложении или аналог в приложении Winforms)
  • Для .Net 4.6 и выше, Tls12 является протоколом по умолчанию, поэтому он не нужен

Ответ 2

Кажется, нет никакого способа сделать это. Свойство SecurityProtocol используется только внутри внутреннего класса TlsStream в одном месте:

enter image description here

TlsStream похоже, поддерживает все внутренние подключения TLS, такие как HTTP, FTP и SMTP.

Я надеялся, что ServicePoint позволяет вам настроить это. Для многих настроек ServicePointManager предоставляет только значение по умолчанию. Эта надежда была необоснованной.

Итак, это довольно убедительное доказательство того, что это невозможно. Однако это не доказательство.

Что вы должны делать? Я бы отключил клиентскую библиотеку HTTP для нечетного сервера, с которым вы разговариваете. HTTP не является особо сложным протоколом. Я уверен, что есть еще одна реализация.

В качестве альтернативы используйте прокси-сервер, который завершает соединение HTTPS на вашем собственном сервере. Затем .NET работает только с HTTP.