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