Požiadavky: V architektúrach mikroslužieb sa volania medzi službami často používajú protokol HTTP, zvyčajne s triedou HttpClient na vykonávanie HTTP požiadaviek alebo jeho použitieRefit.HttpClientFactory、WebApiClientCoreKnižnice tretích strán založené na zapuzdrení HttpClient.
Pre viac informácií o používaní HttpClient, pozrite si:Prihlásenie na hypertextový odkaz je viditeľné.
Zdrojový kód HttpClient:Prihlásenie na hypertextový odkaz je viditeľné.
V HttpClient konštruktore bez parametrov je objekt HttpClientHandler štandardne inštanciovaný a HttpClientHandler dedí a implementuje abstraktnú triedu HttpMessageHandler.Predvolený tok: HttpClient -> HttpClientHandler -> SocketsHttpHandler -> ...
Podľa analýzy zdrojového kódu je objekt zdedený z HttpMessageHandleru konkrétnou implementáciou HttpClient odosielajúcej HTTP požiadavky. HttpClientHttpRequestMessageObjekt sa odovzdá a následne prijmeHttpResponseMessageObjekt vracia obsah.
Skúste vytvoriť novú triedu TestHttpHandler, zdediť abstraktnú triedu HttpMessageHandler a implementovať metódu SendAsync, a potom ju inštancovať v HttpClient konštruktore s nasledujúcim kódom:
Ako je uvedené nižšie:
Hoci volá HttpClient na odoslanie GET požiadavky, konkrétna implementácia metódy SendAsync neodosiela HTTP požiadavku a neexistuje žiadny sieťový tok, takžeMôžete odpojiť sieťový kábel a program bude fungovať normálne。
priPri použití objektu HttpClient sa podkladový socket neuvoľní okamžite, čo môže spôsobiť problémy s vyčerpaním lôžkov. Microsoft si je tohto problému vedomý a odporúča používať IHttpClientFactory v projektoch ASP.NET Core na vytváranie HttpClient objektov.IHttpClientFactory zoskupuje továrensky vytvorené inštancie HttpMessageHandleru do jedného poolu, aby znížil spotrebu zdrojov. Keď vytvoríte novú inštanciu HttpClient, môžete inštanciu HttpMessageHandler v poole znovu použiť(ak obdobie prežitia nevypršalo).
IHttpClientFactory pre .NET:Prihlásenie na hypertextový odkaz je viditeľné.
ASP.NET Core má koncept pipeline middleware,V skutočnosti má HttpClient aj koncept pipeline middleware s pomocou Delegating Handler, ako je znázornené na obrázku nižšie:
Použitím tejto funkcie môžeme zachytávať požiadavky a odpovede, napríklad zvýšiť autentifikáciu tokenov pred požiadavkami, zaznamenať čas potrebný na požiadavky a odpovede a zabaliť dáta odpovedí.
Stačí zdediť triedu DelegatingHandler a prepísať metódu SendAsync.
Zaznamenávanie HTTP požiadaviek trvá čas a kód je nasledovný:
Zavolajte IHttpClientFactory na vytvorenie HttpClient a odoslanie požiadavky, ako je znázornené na nasledujúcom obrázku:
(Koniec)
|