После некоторого исследования я обнаружил, что, хотя DelegatingHandler
s разрешается путем внедрения зависимостей, жизненный цикл DelegatingHandler
s немного неожидан и требует более глубокого знания HttpClientFactory
в .NET Core 2.1.
HttpClientFactory
создает новый HttpClient
каждый раз, но делит HttpMessageHandler
на несколько HttpClient
с. Больше информации об этом вы можете найти в статье Стива Гордона .
Поскольку фактические экземпляры DelegatingHandler
s хранятся внутри HttpMessageHandler
(рекурсивно в свойстве InnerHandler
) и HttpMessageHandler
совместно используется, то DelegatingHandler
s совместно используются таким же образом и имеют тот же жизненный цикл, что и совместно используемые HttpMessageHandler
.
Поставщик услуг здесь используется только для создания новых DelegatingHandler
s, когда HttpClientFactory
«решает» - таким образом, каждый DelegatingHandler
должен быть зарегистрирован как временный! В противном случае вы получите недетерминированное поведение. HttpClientFactory
попытается повторно использовать уже использованный DelegatingHandler
.
Обход
Если вам нужно разрешить зависимости в DelegatingHandler
, вы можете разрешить IHttpContextAccessor
в конструкторе, а затем разрешить зависимости на ServiceProvider
в httpContextAccessor.HttpContext.RequestServices
.
Этот подход не совсем "архитектурно чистый", но это единственный обходной путь, который я нашел.
* +1040 * Пример: * * тысяча сорок один
internal class MyDelegatingHandler : DelegatingHandler
{
private readonly IHttpContextAccessor httpContextAccessor;
protected MyDelegatingHandler(IHttpContextAccessor httpContextAccessor)
{
this.httpContextAccessor = httpContextAccessor;
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var serviceProvider = this.httpContextAccessor.HttpContext.RequestServices;
var myService = serviceProvider.GetRequiredService<IMyService>();
...
}
}