HttpClient
был разработан для многократного использования . Даже через несколько потоков. HttpClientHandler
Имеет полномочия и Куки, которые предназначены , чтобы быть повторно использованы между вызовами. Наличие нового HttpClient
экземпляра требует переустановки всего этого. Также DefaultRequestHeaders
свойство содержит свойства, которые предназначены для нескольких вызовов. Необходимость сбрасывать эти значения в каждом запросе побеждает точку.
Еще одним важным преимуществом HttpClient
является возможность добавления HttpMessageHandlers
в конвейер запросов / ответов для применения сквозных задач. Это могут быть записи, аудит, регулирование, обработка перенаправления, автономная обработка, получение метрик. Все виды разных вещей. Если новый HttpClient создается при каждом запросе, то все эти обработчики сообщений должны быть настроены для каждого запроса, и каким-либо образом должно быть предоставлено любое состояние уровня приложения, которое совместно используется запросами для этих обработчиков.
Чем больше вы используете функции HttpClient
, тем больше вы увидите, что повторное использование существующего экземпляра имеет смысл.
Однако самая большая проблема, на мой взгляд, заключается в том, что когда HttpClient
класс удаляется, он удаляется HttpClientHandler
, что затем принудительно закрывает TCP/IP
соединение в пуле соединений, которым управляет ServicePointManager
. Это означает, что каждый запрос с новым HttpClient
требует восстановления нового TCP/IP
соединения.
Из моих тестов, использующих простой HTTP в локальной сети, снижение производительности довольно незначительно. Я подозреваю, что это потому, что есть основной протокол активности TCP, который удерживает соединение открытым, даже когда HttpClientHandler
пытается его закрыть.
По запросам, которые идут через интернет, я видел другую историю. Я видел снижение производительности на 40% из-за необходимости каждый раз заново открывать запрос.
Я подозреваю, что попадание в HTTPS
соединение будет еще хуже.
Мой совет - сохранить экземпляр HttpClient на время жизни вашего приложения для каждого отдельного API, к которому вы подключаетесь.
Stopwatch
класс для его оценки. Моя оценка была бы более разумнойHttpClient
, если бы все эти экземпляры использовались в одном и том же контексте.