Krav: I mikroservicearkitekturer bruger opkald mellem tjenester ofte HTTP-protokollen, som regel ved brug af HttpClient-klassen til at lave HTTP-forespørgsler eller bruge denRefit.HttpClientFactory、WebApiClientCoreTredjepartsbiblioteker baseret på HttpClient-indkapsling.
For mere information om brugen af HttpClient, henvises til:Hyperlink-login er synlig.
HttpClient-kildekode:Hyperlink-login er synlig.
I HttpClient-parameterløse konstruktøren er HttpClientHandler-objektet som standard instansieret, og HttpClientHandler arver og implementerer den abstrakte HttpMessageHandler-klasse.Standardflow: HttpClient -> HttpClientHandler -> SocketsHttpHandler -> ...
Ifølge kildekodeanalyse er objektet, der arves fra HttpMessageHandler, en konkret implementering af HttpClient, der sender HTTP-anmodninger. HttpClient vilHttpRequestMessageObjektet sendes ind og modtages derefterHttpResponseMessageObjekt returnerer indhold.
Prøv at oprette en ny TestHttpHandler-klasse, arve HttpMessageHandler-abstraktionsklassen og implementere SendAsync-metoden, og instansier den derefter i HttpClient-konstruktøren med følgende kode:
Som vist nedenfor:
Selvom man kalder HttpClient for at sende en GET-anmodning, sender den specifikke implementering af SendAsync-metoden ikke en HTTP-forespørgsel, og der er ikke noget netværksflow, såDu kan trække netværkskablet ud, og programmet vil fungere normalt。
vedNår man bruger et HttpClient-objekt, frigives den underliggende socket ikke straks, hvilket kan give problemer med udtømning af sokkel. Microsoft er opmærksom på dette problem og anbefaler at bruge IHttpClientFactory i ASP.NET Core-projekter til at oprette HttpClient-objekter.IHttpClientFactory samler fabriksoprettede HttpMessageHandler-instanser i en pulje for at reducere ressourceforbruget. Når du opretter en ny HttpClient-instans, kan du genbruge HttpMessageHandler-instansen i poolen(hvis overlevelsesperioden ikke er udløbet).
IHttpClientFactory for .NET:Hyperlink-login er synlig.
ASP.NET Core har konceptet pipeline middleware,Faktisk har HttpClient også konceptet pipeline-middleware med hjælp fra Delegating Handler, som vist i figuren nedenfor:
Ved at bruge denne funktion kan vi opsnappe forespørgsler og svar, såsom at øge tokenautentificeringen før anmodninger, registrere den tid, der kræves for anmodninger og svar, samt indpakke svardata.
Arv bare DelegatingHandler-klassen og overskriv SendAsync-metoden.
Registrering af HTTP-forespørgsler tager tid, og koden er som følger:
Kald IHttpClientFactory for at oprette en HttpClient og send en anmodning, som vist på følgende billede:
(Slut)
|