HttpClient
został zaprojektowany do ponownego wykorzystania w wielu połączeniach . Nawet w wielu wątkach. HttpClientHandler
Ma mandatów oraz plików cookie, które są przeznaczone do ponownego użycia w poprzek połączeń. Posiadanie nowej HttpClient
instancji wymaga ponownego skonfigurowania wszystkich tych rzeczy. PonadtoDefaultRequestHeaders
właściwość zawiera właściwości przeznaczone dla wielu wywołań. Konieczność resetowania tych wartości przy każdym żądaniu mija się z celem.
Inną ważną zaletą HttpClient
jest możliwość dodawania HttpMessageHandlers
do potoku żądań / odpowiedzi w celu zastosowania przekrojowych problemów. Mogą to być rejestrowanie, audyt, ograniczanie przepustowości, obsługa przekierowań, obsługa offline, przechwytywanie metryk. Wiele różnych rzeczy. Jeśli nowy HttpClient jest tworzony dla każdego żądania, wszystkie te programy obsługi komunikatów muszą być skonfigurowane dla każdego żądania i w jakiś sposób należy również podać stan poziomu aplikacji, który jest współużytkowany między żądaniami dla tych programów obsługi.
Im częściej używasz funkcji programu HttpClient
, tym bardziej przekonasz się, że ponowne wykorzystanie istniejącej instancji ma sens.
Jednak moim zdaniem największym problemem jest to, że kiedy HttpClient
klasa jest usuwana, usuwa HttpClientHandler
, co następnie wymusza zamknięcie TCP/IP
połączenia w puli połączeń, którą zarządza ServicePointManager
. Oznacza to, że każde żądanie z nowym HttpClient
wymaga ponownego ustanowienia nowego TCP/IP
połączenia.
Z moich testów, używając zwykłego protokołu HTTP w sieci LAN, wpływ wydajności jest dość znikomy. Podejrzewam, że dzieje się tak dlatego, że istnieje podstawowa funkcja utrzymywania aktywności TCP, która wstrzymuje połączenie, nawet gdy HttpClientHandler
próbuje je zamknąć.
W przypadku żądań przesyłanych przez Internet spotkałem się z inną historią. Widziałem 40% spadek wydajności z powodu konieczności ponownego otwierania żądania za każdym razem.
Podejrzewam, że uderzenie w HTTPS
połączenie byłoby jeszcze gorsze.
Moja rada jest taka, aby zachować wystąpienie HttpClient przez cały okres istnienia aplikacji dla każdego odrębnego interfejsu API, z którym się łączysz.
Stopwatch
klasy do porównania jej. Moim zdaniem bardziej sensowne byłoby posiadanie jednegoHttpClient
, zakładając, że wszystkie te instancje są używane w tym samym kontekście.