Использование HttpClient
не так просто, как я бы надеялся. Несмотря на то, что это тип IDisposable
, не рекомендуется заключать его в оператор using
и даже идеально делать его единичным. Однако, как насчет того, чтобы передать HttpClientHandler
в конструктор HttpClient
, например:
using (var client = new HttpClient(singletonHttpClientHandler, false);
Я видел код, подобный приведенному выше, где HttpClient
преднамеренно заключен в using
заявление, но HttpClientHandler
является одиночным. Документы указывают, что обработчик клиента удаляется, если только второй параметр не указывает false
, как сделано выше:
См. 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, что, как мне кажется, имеет место.