Вимоги: В архітектурах мікросервісів виклики між сервісами часто використовують протокол 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 має концепцію конвеєрного проміжного програмного забезпечення,Насправді HttpClient також має концепцію проміжного програмного забезпечення pipeline за допомогою Delegating Handler, як показано на рисунку нижче:
Використовуючи цю функцію, ми можемо перехоплювати запити та відповіді, такі як збільшення автентифікації токена перед запитами, фіксація часу, необхідного для запитів і відповідей, а також обгортання даних відповідей.
Просто успадкуйте клас DelegatingHandler і перезапишіть метод SendAsync.
Запис HTTP-запитів займає час, і код виглядає так:
Викликайте IHttpClientFactory, щоб створити HttpClient і надіслати запит, як показано на наступному зображенні:
(Кінець)
|