Požadavky: V architekturách mikroslužeb často volání mezi službami používají protokol HTTP, obvykle s třídou HttpClient pro HTTP požadavky nebo jej použitíRefit.HttpClientFactory、WebApiClientCoreKnihovny třetích stran založené na zapouzdření HttpClient.
Pro více informací o používání HttpClient se podívejte na:Přihlášení k hypertextovému odkazu je viditelné.
Zdrojový kód HttpClient:Přihlášení k hypertextovému odkazu je viditelné.
V bezparametrovém konstruktoru HttpClient je objekt HttpClientHandler ve výchozím nastavení instancován a HttpClientHandler dědí a implementuje abstraktní třídu HttpMessageHandler.Výchozí flow: HttpClient -> HttpClientHandler -> SocketsHttpHandler -> ...
Podle analýzy zdrojového kódu je objekt zděděný z HttpMessageHandleru konkrétní implementací HttpClientu odesílajícího HTTP požadavky. HttpClient budeHttpRequestMessageObjekt je předán a poté přijatHttpResponseMessageObjekt vrací obsah.
Zkuste vytvořit novou třídu TestHttpHandler, zdědit abstrakci HttpMessageHandler a implementovat metodu SendAsync, a poté ji instancovat ve konstruktoru HttpClient s následujícím kódem:
Jak je uvedeno níže:
Ačkoliv volám HttpClient pro odeslání GET požadavku, konkrétní implementace metody SendAsync HTTP požadavek neodešle a síťový tok neprobíhá, takžeMůžete odpojit síťový kabel a program bude fungovat normálně。
uPři použití objektu HttpClient není základní socket uvolněn ihned, což může způsobovat problémy s vyčerpáním lůžka. Microsoft si je tohoto problému vědom a doporučuje používat IHttpClientFactory v projektech ASP.NET Core pro tvorbu HttpClient objektů.IHttpClientFactory sdružuje továrně vytvořené instance HttpMessageHandlerů do jednoho poolu, aby snížil spotřebu zdrojů. Když vytvoříte novou instanci HttpClient, můžete instanci HttpMessageHandler znovu použít v poolu(pokud doba přežití nevypršela).
IHttpClientFactory pro .NET:Přihlášení k hypertextovému odkazu je viditelné.
ASP.NET Core má koncept pipeline middleware,Ve skutečnosti má HttpClient také koncept pipeline middleware s pomocí Delegating Handler, jak je znázorněno na obrázku níže:
Použitím této funkce můžeme zachytávat požadavky a odpovědi, například zvýšit autentizaci tokenu před žádostmi, zaznamenat čas potřebný pro požadavky a odpovědi a obalit data odpovědí.
Stačí zdědit třídu DelegatingHandler a přepsat metodu SendAsync.
Zaznamenávání HTTP požadavků trvá čas a kód je následující:
Zavolejte IHttpClientFactory a vytvořte HttpClient a pošlete požadavek, jak je znázorněno na následujícím obrázku:
(Konec)
|