Установите протокол HTTP/1.1 ИЛИ HTTP/2.0

#c# #asp.net-core-webapi #tls1.2 #http2 #http-1.1

Вопрос:

У меня есть веб-приложение (ионное приложение) и служба DotNet Core WebAPI. Я разместил его на 2 разных серверах IIS, т. е. Server1 и Server2. Иногда мое приложение неправильно ведет себя на Server2. Когда я отлаживал код и просматривал журналы, я обнаружил странное поведение в журналах WebAPI.

Сервер1: Приложение работает нормально. Если я посмотрю журналы, я смогу увидеть протокол HTTP/2.0 для всех запросов API. Для HTTP/1.1 нет ни одного запроса.

 Request starting HTTP/2.0
 

Сервер2: Приложение ведет себя неправильно. Я вижу два протокола для запросов API. Иногда я вижу протокол HTTP/1.1, а иногда протокол HTTP/2.0.

 Request starting HTTP/1.1
Request starting HTTP/2.0
 

Основная проблема на Server2: эти два протокола используются для одного запроса. Допустим, когда я нажимаю API(getData) из своего приложения, я вижу два запроса getData в журналах. Единственное различие заключается в том, что оба запроса имеют разные протоколы HTTP, т. е. HTTP/1.1 и HTTP/2.0.

Когда я проверяю инструмент разработчика Chrome на наличие сетевых вызовов, я вижу только один вызов, сделанный приложением. На вкладке сеть используется протокол HTTP/1.1. Для одного и того же запроса я вижу два разных запроса в журналах API с разными протоколами HTTP. Кроме того, я вижу, что все нормально работает с запросом HTTP/2.0 в журналах API (логика API), но мое приложение ожидало запроса HTTP/1.1. Итак, мое приложение не получает ответ от API по HTTP/1.1 и показывает ошибку в приложении.

Реализация API getData: Я получаю некоторые данные из стороннего сервиса. сторонняя служба может возвращать данные только один раз для одного идентификатора сеанса. Поскольку я получаю два запроса (означает, что код getData выполняется дважды), я получил данные от стороннего сервиса по запросу протокола HTTP/2.0, но не по HTTP/1.1. Таким образом, запрос, использующий HTTP/1.1, сделал тайм-аут и выдал ошибку в приложении.

Вопрос: Могу ли я управлять протоколом HTTP? Если да, я хотел бы установить, чтобы каждый запрос выполнялся по протоколу HTTP/2.0 ИЛИ HTTP/1.1. У меня есть полный контроль над сервером IIS, поэтому я могу изменить любую конфигурацию, если это потребуется. Можно ли что-то сделать с конфигурацией TLS1.2?

ОБНОВЛЕНИЕ: Я думаю, что я понял основную причину проблемы.

Сервер1: Все запросы выполняются по протоколу HTTP/2.0. (Проверил журналы IIS)

Server2: Все запросы выполняются по протоколу HTTP/1.1. (Проверил журналы IIS) Но все еще не уверен, какой компонент генерирует новый запрос для протокола HTTTP/2.0 на Server2.

Ну, я запустил команду curl и обнаружил новую проблему «HTTP/2 поток 0 не был закрыт чисто: HTTP_1_1_REQUIRED (ошибка 13)«. Я думаю, что из-за этой проблемы все запросы выполняются по протоколу HTTP/1.1. Если я исправлю это, вся служба будет использовать протокол HTTP/2.0.

Вопрос:

введите описание изображения здесь

Теперь, как я могу исправить эту проблему с сервером? Я не хочу, чтобы это вошло в код. (Я имею в виду, что укажите протокол HTTP в коде)

Комментарии:

1. HTTP 1.1-это режим фрагментации, который требует, чтобы клиент отправил следующее сообщение фрагмента на сервер. Если следующий фрагмент не будет отправлен, произойдет тайм-аут. Некоторые клиенты не работают с 1.1, и вместо этого вам приходится использовать 1.0 (режим потока).

2. Не понял вашего комментария. Не могли бы вы поподробнее, пожалуйста?

3. Вы можете указать версию следующим образом : HttpWebRequest запрос = (HttpWebRequest)веб-запрос. Создать(«»); запрос. Преобразование протокола = HttpVersion. Версия 10;

4. На самом деле это ионное приложение, которое делает запрос API. И я не хочу указывать версию HTTP в коде. Так как мой код отлично работает на другом сервере. Итак, мне нужно решить проблему с конкретным сервером.

5. Сервер, который работает, вероятно, использует 1.0, а новый используемый сервер использует 1.1. Клиент работает только с 1.0. Поэтому установка значения 1.0 будет поддерживать работу кода в том же режиме, который всегда использовался. Старый сервер не поддерживает 1.1, и сетевой клиент будет работать только с 1.0. Когда вы переходите на новый сервер, который по умолчанию имеет значение 1.1, и не указываете версию на клиенте, код не работает.