Создание специального обработчика HttpMessageHandler¶
Для большинства сторонних API при их вызове требуется некая форма аутентификации. Очень частым вариантом является добавление API-ключа (ApiKey) к исходящему запросу. Создадим собственный обработчик HttpMessageHandler для выполнения этой задачи.
Примечание
Более сложные API-интерфейсы могут использовать JWT, полученные от поставщика идентификационной информации. В этом случае можно рассмотреть возможность использования библиотеки IdentityModel, обеспечивающей точки интеграции для ASP.NET Core Identity и IHttpClientFactory.
Наш обработчик будет частью обработчиков HttpClient.

Для создания собственного обработчика нужно выполнить следующее.
- Создаём обработчик, наследуя от базового класса
DelegatingHandler; - Переопределяем метод
SendAsync()для выполнения нужной задачи. Вызываемbase.SendAsync()для выполнения оставшейся части конвейера; - Регистрируем обработчик в DI контейнере с жизненным циклом Singleton (если не требуется состояние) или Transient;
- Добавляем обработчик к одному или нескольким именованным или типизированным клиентам, вызвав метод
AddHttpMessageHandler<T>(). Порядок, в котором регистрируются обработчики, определяет порядок их добавления в конвейер. При необходимости один и тот же тип обработчика может быть добавлен несколько раз, а также для нескольких клиентов.
Вот пример специального обработчика, добавляющего заголовок к каждому запросу.
public class ApiKeyMessageHandler: DelegatingHandler
{
private readonly ExchangeRateApiSettings _settings;
public ApiKeyMessageHandler(IOptions<ExchangeRateApiSettings> settings)
{
_settings = settings.Value;
}
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
request.Headers.Add("X-API-KEY", _settings.ApiKey);
var response = await base.SendAsync(request, cancellationToken);
//Если необходимо, ответ можно проверить или изменить
return response;
}
}
Теперь регистрируем обработчик и добавляем его к именованному или типизированному клиенту.
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<ApiKeyMessageHandler>();
services.AddHttpClient<ExchangeRatesClient>()
.AddHttpMessageHandler<ApiKeyMessageHandler>()
.AddTransientHttpErrorPolicy(policy =>
policy.WaitAndRetryAsync(new[] {
TimeSpan.FromMilliseconds(200),
TimeSpan.FromMilliseconds(500),
TimeSpan.FromSeconds(1)
})
);
}
Последнее обновление :
25 февраля 2023 г.
Дата создания : 30 октября 2022 г.
Дата создания : 30 октября 2022 г.