Wymagania: W architekturach mikroserwisów wywołania między usługami często wykorzystują protokół HTTP, zwykle używając klasy HttpClient do wykonywania żądań HTTP lub jego używaniaRefit.HttpClientFactory、WebApiClientCoreBiblioteki firm trzecich oparte na enkapsulacji HttpClient.
Aby uzyskać więcej informacji o korzystaniu z HttpClient, prosimy odpowiedzieć na:Logowanie do linku jest widoczne.
Kod źródłowy HttpClient:Logowanie do linku jest widoczne.
W konstruktorze HttpClient bez parametrów obiekt HttpClientHandler jest domyślnie instancjonowany, a HttpClientHandler dziedziczy i implementuje abstrakcyjną klasę HttpMessageHandler.Domyślny przepływ: HttpClient -> HttpClientHandler -> SocketsHttpHandler -> ...
Według analizy kodu źródłowego, obiekt odziedziczony po HttpMessageHandler jest konkretną implementacją HttpClienta wysyłającego żądania HTTP. HttpClient będzieHttpRequestMessageObiekt jest przekazywany, a następnie odbieranyHttpResponseMessageObiekt zwraca treść.
Spróbuj utworzyć nową klasę TestHttpHandler, odziedziczyć klasę abstrakcji HttpMessageHandler i zaimplementować metodę SendAsync, a następnie zinstancjonować ją w konstruktorze HttpClient, z następującym kodem:
Jak pokazano poniżej:
Chociaż wywoływanie HttpClient w celu wysłania żądania GET, konkretna implementacja metody SendAsync nie wysyła żądania HTTP i nie ma przepływu sieciowego, więcMożesz odłączyć kabel sieciowy i program będzie działał normalnie。
przyPodczas korzystania z obiektu HttpClient bazowe gniazdo nie jest od razu zwalniane, co może powodować problemy z wyczerpaniem gniazd. Microsoft jest świadomy tego problemu i zaleca użycie IHttpClientFactory w projektach ASP.NET Core do tworzenia obiektów HttpClient.IHttpClientFactory łączy fabrycznie tworzone instancje HttpMessageHandler do puli, aby zmniejszyć zużycie zasobów. Gdy tworzysz nową instancję HttpClient, możesz ponownie użyć instancji HttpMessageHandler w puli(jeśli okres przetrwania nie upłynął).
IHttpClientFactory dla .NET:Logowanie do linku jest widoczne.
ASP.NET Core posiada koncepcję middleware pipeline,W rzeczywistości HttpClient posiada także koncepcję middleware pipeline z pomocą Delegating Handler, jak pokazano na poniższym rysunku:
Dzięki tej funkcji możemy przechwytywać żądania i odpowiedzi, takie jak zwiększenie uwierzytelniania tokenów przed zgłoszeniami, rejestrowanie czasu potrzebnego na żądania i odpowiedzi oraz opakowanie danych odpowiedzi.
Po prostu odziedzicz klasę DelegatingHandler i nadpisz metodę SendAsync.
Rejestrowanie zapytań HTTP zajmuje trochę czasu, a kod wygląda następująco:
Zadzwoń do IHttpClientFactory, aby utworzyć HttpClient i wysłać żądanie, jak pokazano na poniższym obrazku:
(Koniec)
|