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