Krav: I mikrotjänstearkitekturer använder samtal mellan tjänster ofta HTTP-protokollet, vanligtvis med HttpClient-klassen för att göra HTTP-förfrågningar eller använda denRefit.HttpClientFactory、WebApiClientCoreTredjepartsbibliotek baserade på HttpClient-inkapsling.
För mer information om användning av HttpClient, vänligen se:Inloggningen med hyperlänken är synlig.
HttpClient-källkod:Inloggningen med hyperlänken är synlig.
I HttpClients parameterlösa konstruktör instansieras objektet HttpClientHandler som standard, och HttpClientHandler ärver och implementerar den abstrakta klassen HttpMessageHandler.Standardflöde: HttpClient -> HttpClientHandler -> socketsHttpHandler -> ...
Enligt källkodsanalys är objektet som ärvs från HttpMessageHandler en konkret implementation av HttpClient som skickar HTTP-förfrågningar. HttpClient kommerHttpRequestMessageObjektet skickas in och tas sedan emotHttpResponseMessageObjekt returnerar innehåll.
Försök skapa en ny TestHttpHandler-klass, ärva abstraktionsklassen HttpMessageHandler och implementera metoden SendAsync, och sedan instansiera den i HttpClient-konstruktören med följande kod:
Som visas nedan:
Även om man anropar HttpClient för att skicka en GET-förfrågan, skickar den specifika implementationen av metoden SendAsync ingen HTTP-förfrågan, och det finns inget nätverksflöde, såDu kan koppla ur nätverkskabeln och programmet fungerar normalt。
vidNär man använder ett HttpClient-objekt släpps inte den underliggande socketen omedelbart, vilket kan orsaka problem med utmattning av hylsor. Microsoft är medvetet om detta problem och rekommenderar att använda IHttpClientFactory i ASP.NET Core-projekt för att skapa HttpClient-objekt.IHttpClientFactory samlar fabriksskapade HttpMessageHandler-instanser i en pool för att minska resursförbrukningen. När du skapar en ny HttpClient-instans kan du återanvända HttpMessageHandler-instansen i poolen(om överlevnadsperioden inte har löpt ut).
IHttpClientFactory för .NET:Inloggningen med hyperlänken är synlig.
ASP.NET Core har konceptet pipeline-middleware,Faktum är att HttpClient också har konceptet pipeline-middleware med hjälp av Delegating Handler, som visas i figuren nedan:
Genom att använda denna funktion kan vi avlyssna förfrågningar och svar, såsom att öka tokenautentisering före förfrågningar, registrera tiden som krävs för förfrågningar och svar samt paketera svarsdata.
Ärva bara klassen DelegatingHandler och åsidosätt metoden SendAsync.
Att spela in HTTP-förfrågningar tar tid, och koden är följande:
Anropa IHttpClientFactory för att skapa en HttpClient och skicka en förfrågan, som visas i följande bild:
(Slut)
|