Krav: I mikrotjenestearkitekturer bruker samtaler mellom tjenester ofte HTTP-protokollen, vanligvis ved å bruke HttpClient-klassen for å gjøre HTTP-forespørsler, eller bruke denRefit.HttpClientFactory、WebApiClientCoreTredjepartsbiblioteker basert på HttpClient-innkapsling.
For mer informasjon om bruk av HttpClient, vennligst se:Innloggingen med hyperkoblingen er synlig.
HttpClient-kildekode:Innloggingen med hyperkoblingen er synlig.
I den parameterløse konstruktøren HttpClient er HttpClientHandler-objektet som standard instansiert, og HttpClientHandler arver og implementerer den abstrakte klassen HttpMessageHandler.Standardflyt: HttpClient -> HttpClientHandler -> socketsHttpHandler -> ...
Ifølge kildekodeanalyse er objektet arvet fra HttpMessageHandler en konkret implementering av HttpClient som sender HTTP-forespørsler. HttpClient vilHttpRequestMessageObjektet sendes inn og mottas deretterHttpResponseMessageObjekt returnerer innhold.
Prøv å lage en ny TestHttpHandler-klasse, arve HttpMessageHandler-abstraksjonsklassen og implementere SendAsync-metoden, og deretter instansiere den i HttpClient-konstruktøren med følgende kode:
Som vist nedenfor:
Selv om man kaller HttpClient for å sende en GET-forespørsel, sender den spesifikke implementeringen av SendAsync-metoden ikke en HTTP-forespørsel, og det finnes ingen nettverksflyt, såDu kan koble fra nettverkskabelen, og programmet vil fungere normalt。
påNår man bruker et HttpClient-objekt, frigjøres ikke den underliggende socketen umiddelbart, noe som kan føre til problemer med utmattelse av sokkelen. Microsoft er klar over dette problemet og anbefaler å bruke IHttpClientFactory i ASP.NET Core-prosjekter for å lage HttpClient-objekter.IHttpClientFactory samler fabrikkopprettede HttpMessageHandler-instanser i en pool for å redusere ressursforbruket. Når du oppretter en ny HttpClient-instans, kan du gjenbruke HttpMessageHandler-instansen i poolen(hvis overlevelsesperioden ikke er utløpt).
IHttpClientFactory for .NET:Innloggingen med hyperkoblingen er synlig.
ASP.NET Core har konseptet pipeline-mellomvare,Faktisk har HttpClient også konseptet pipeline-mellomvare med hjelp av Delegating Handler, som vist i figuren nedenfor:
Ved å bruke denne funksjonen kan vi avskjære forespørsler og svar, som å øke tokenautentisering før forespørsler, registrere tiden som kreves for forespørsler og svar, og pakke inn svardata.
Bare arv DelegatingHandler-klassen og overstyr SendAsync-metoden.
Opptak av HTTP-forespørsler tar tid, og koden er som følger:
Ring IHttpClientFactory for å opprette en HttpClient og sende en forespørsel, som vist i følgende bilde:
(Slutt)
|