Каковы оптимальные методы использования HttpClient и HttpClientHandler для нескольких конечных точек? - PullRequest
2 голосов
/ 21 октября 2019

Использование HttpClient не так просто, как я бы надеялся. Несмотря на то, что это тип IDisposable, не рекомендуется заключать его в оператор using и даже идеально делать его единичным. Однако, как насчет того, чтобы передать HttpClientHandler в конструктор HttpClient, например:

using (var client = new HttpClient(singletonHttpClientHandler, false);

Я видел код, подобный приведенному выше, где HttpClient преднамеренно заключен в using заявление, но HttpClientHandler является одиночным. Документы указывают, что обработчик клиента удаляется, если только второй параметр не указывает false, как сделано выше:

enter image description here

См. https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=netframework-4.8#constructors

Часть проблемы с использованием HttpClient заключается в нескольких вещах, таких как время ожидания должно быть общим для всех экземпляров этого HttpClient, поэтому по этой причине было бы неплохо создать отдельные экземпляры HttpClient, которые используют один и тот же пул соединений, предположительно предоставляемыйHttpClientHandler (при условии, что это так). Меня беспокоит то, что я не хочу, чтобы HttpClient создавал пул соединений, который затем будет удаляться каждый раз. Есть много сообщений о том, как это действительно плохо сказывается на производительности. Кажется, я не могу найти хорошую документацию по эффективному использованию HttpClient вместе с HttpClientHandlers.

Итак ... Мой вопрос в основном:

При совместном использовании HttpClient & HttpClientHandler,лучше ли сделать HttpClientHandler единичным, а затем создавать каждый раз столько новых HttpClients в using блоках? - Это опять-таки имеет смысл, только если пул соединений управляется HttpClientHandler, что, как мне кажется, имеет место.

...