Изисквания: В архитектурите на микросервисите повикванията между услуги често използват HTTP протокола, обикновено използвайки класа HttpClient за извършване на HTTP заявки или използване на негоRefit.HttpClientFactory、WebApiClientCoreБиблиотеки на трети страни, базирани на капсулация в HttpClient.
За повече информация относно използването на HttpClient, моля, вижте с:Входът към хиперлинк е видим.
Изходен код на HttpClient:Входът към хиперлинк е видим.
В конструктора без параметри HttpClient, обектът HttpClientHandler се инстанцира по подразбиране, а HttpClientHandler наследява и реализира абстрактния клас HttpMessageHandler.Дефолтен поток: HttpClient -> HttpClientHandler -> SocketsHttpHandler -> ...
Според анализа на изходния код, обектът, наследен от HttpMessageHandler, е конкретна реализация на HttpClient, изпращаща HTTP заявки. httpClient щеhttpRequestMessageОбектът се подава и след това се получаваhttpResponseMessageОбектът връща съдържание.
Опитайте да създадете нов клас TestHttpHandler, като наследите класа на абстракция HttpMessageHandler и имплементирате метода SendAsync, след което го инстанцирайте в конструктора на HttpClient с следния код:
Както е показано по-долу:
Въпреки че се извиква HttpClient за изпращане на GET заявка, специфичната реализация на метода SendAsync не изпраща HTTP заявка и няма мрежов поток, така чеМожеш да изключиш мрежовия кабел и програмата ще работи нормално。
вПри използване на HttpClient обект, основният сокет не се освобождава веднага, което може да причини проблеми с изтощението на гнездото. Microsoft е наясно с този проблем и препоръчва използването на IHttpClientFactory в ASP.NET Core проекти за създаване на HttpClient обекти.IHttpClientFactory обединява фабрично създадени HttpMessageHandler инстанции в пул, за да намали потреблението на ресурси. Когато създавате нова HttpClient инстанция, може да използвате HttpMessageHandler инстанцията в пула(ако периодът на оцеляване не е изтекъл).
IHttpClientFactory за .NET:Входът към хиперлинк е видим.
ASP.NET Core има концепцията за pipeline middleware,Всъщност HttpClient има и концепция за pipeline middleware с помощта на Delegating Handler, както е показано на фигурата по-долу:
Чрез тази функция можем да прихващаме заявки и отговори, като увеличаване на удостоверяването на токените преди заявките, записване на времето, необходимо за заявки и отговори, и опаковане на данните за отговори.
Просто наследи класа DelegatingHandler и презапиш метода SendAsync.
Записването на HTTP заявки отнема време, а кодът е следният:
Извикайте IHttpClientFactory, за да създадете HttpClient и да изпратите заявка, както е показано на следното изображение:
(Край)
|