Как отключить конвейеризацию для .NET HttpClient - PullRequest
0 голосов
/ 02 ноября 2018

Как видно из заголовка, я бы хотел отключить функцию конвейерной обработки, НО по-прежнему использовать пул соединений (поэтому KeepAlive = False не вариант). Причина в том, что более длинные запросы могут помешать более коротким запросам выполняться быстро, но открытие нового соединения для каждого запроса значительно медленнее.

Я делаю это:

_webRequestHandler = new WebRequestHandler();
_webRequestHandler.AllowPipelining = false;

_httpClient = new HttpClient(_webRequestHandler);
await _httpClient.SendAsync(request);

servicePoint = ServicePointManager.FindServicePoint(request.RequestUri);

Это, похоже, не имеет никакого эффекта: свойство ServicePoint.SupportsPipelining все еще имеет значение true, а WebRequestHandler только устанавливает свойство Pipelined для HttpWebRequest, но ничего в HttpRequestMessage, поэтому в основном установка AllowPipelining в WebRequestHandler не имеет никакого эффекта (?).

Я что-то здесь упускаю? Я уверен, что это распространенный сценарий - как мне этого добиться?

1 Ответ

0 голосов
/ 11 декабря 2018

Ситуация сохраняется:

  • Установка ConnectionClose в true для HttpClient выдает KeepAlive: false и устанавливает новое соединение для каждого запроса. Это оказывает значительное негативное влияние на производительность и поэтому нежелательно.
  • Настройка ConnectionClose в false повторно использует соединения - но только тогда, когда они свободны (нет ожидающих запросов). При большом количестве одновременных запросов все равно будет открыто большое количество соединений.
  • Установка ConnectionLimit на HttpClient в Environment.ProcessorCount * 12 (как предлагает MS) ограничивает количество открытых соединений указанным значением. К сожалению, это приводит к случайной безответственности, закрывающей всю систему! Я предполагаю, что это происходит, когда используются все открытые соединения, активируется конвейерная обработка, а затем ... что-то происходит. Вот почему я хотел отключить конвейеризацию (просто подождите, пока любое открытое соединение не станет свободным, и используйте его повторно).

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

Итак, я установил ConnectionLimit равным 1000, что кажется достаточно высоким, чтобы проблема никогда не возникала (в нашей системе). Хотя это не совсем исправление - не стесняйтесь писать, если у вас есть лучшее решение ...

...