Vereisten: In microservices-architecturen gebruiken oproepen tussen services vaak het HTTP-protocol, meestal met de HttpClient-klasse om HTTP-verzoeken te doen, of deze te gebruikenRefit.HttpClientFactory、WebApiClientCoreBibliotheken van derden gebaseerd op HttpClient-encapsulatie.
Voor meer informatie over het gebruik van HttpClient, verwijs naar:De hyperlink-login is zichtbaar.
HttpClient-broncode:De hyperlink-login is zichtbaar.
In de HttpClient parameterloze constructor wordt het HttpClientHandler-object standaard geïnstantieerd, en de HttpClientHandler erft en implementeert de abstracte klasse HttpMessageHandler.Standaardflow: HttpClient -> HttpClientHandler -> SocketsHttpHandler -> ...
Volgens broncode-analyse is het object dat van de HttpMessageHandler wordt geërfd een concrete implementatie van de HttpClient die HTTP-verzoeken verzendt. HttpClient zal het doenHttpRequestMessageHet object wordt doorgegeven en vervolgens ontvangenHttpResponseMessageObject geeft inhoud terug.
Probeer een nieuwe TestHttpHandler-klasse aan te maken, de abstractieklasse HttpMessageHandler te erven en de SendAsync-methode te implementeren, en deze vervolgens te instantiëren in de HttpClient-constructor, met de volgende code:
Zoals hieronder getoond:
Hoewel HttpClient wordt aangeroepen om een GET-verzoek te versturen, stuurt de specifieke implementatie van de SendAsync-methode geen HTTP-verzoek en is er geen netwerkflow, dusJe kunt de netwerkkabel loskoppelen en het programma werkt normaal。
opBij gebruik van een HttpClient-object wordt de onderliggende socket niet direct vrijgegeven, wat problemen met socketuitputting kan veroorzaken. Microsoft is zich bewust van dit probleem en raadt aan om IHttpClientFactory te gebruiken in ASP.NET Core-projecten om HttpClient-objecten te creëren.IHttpClientFactory poolt fabrieksgemaakte HttpMessageHandler-instanties in een pool om het resourceverbruik te verminderen. Wanneer je een nieuwe HttpClient-instantie aanmaakt, kun je de HttpMessageHandler-instantie opnieuw gebruiken in de pool(als de overlevingstijd nog niet is verstreken).
IHttpClientFactory voor .NET:De hyperlink-login is zichtbaar.
ASP.NET Core heeft het concept van pipeline middleware,Sterker nog, HttpClient heeft ook het concept van pipeline middleware met behulp van Delegating Handler, zoals getoond in de onderstaande figuur:
Door deze functie te gebruiken kunnen we verzoeken en antwoorden onderscheppen, zoals het verhogen van tokenauthenticatie vóór verzoeken, het registreren van de tijd die nodig is voor verzoeken en antwoorden, en het wrappen van responsgegevens.
Erf gewoon de DelegatingHandler-klasse en overschrijf de SendAsync-methode.
Het opnemen van HTTP-verzoeken kost tijd, en de code is als volgt:
Bel IHttpClientFactory om een HttpClient aan te maken en een verzoek te versturen, zoals te zien is in de volgende afbeelding:
(Einde)
|