HttpClientzostał zaprojektowany do ponownego wykorzystania w wielu połączeniach . Nawet w wielu wątkach. HttpClientHandlerMa mandatów oraz plików cookie, które są przeznaczone do ponownego użycia w poprzek połączeń. Posiadanie nowej HttpClientinstancji 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ą HttpClientjest możliwość dodawania HttpMessageHandlersdo 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 HttpClientklasa jest usuwana, usuwa HttpClientHandler, co następnie wymusza zamknięcie TCP/IPpołączenia w puli połączeń, którą zarządza ServicePointManager. Oznacza to, że każde żądanie z nowym HttpClientwymaga ponownego ustanowienia nowego TCP/IPpołą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 HttpClientHandlerpró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 HTTPSpołą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.
Stopwatchklasy 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.