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, припускаючи, що всі ці екземпляри використовуються в одному контексті.