Есть ли способ добавить обработчики к HTTP-клиенту по умолчанию в ASP.NET Core? Что-то вроде этого?
.AddHttpClient()
.AddHttpMessageHandler<Handler1>()
.AddHttpMessageHandler<Handler2>();
Есть ли способ добавить обработчики к HTTP-клиенту по умолчанию в ASP.NET Core? Что-то вроде этого?
.AddHttpClient()
.AddHttpMessageHandler<Handler1>()
.AddHttpMessageHandler<Handler2>();
В документации указано, что вы можете добавлять обработчики или настраивать самый внутренний обработчик только для именованных или типизированных клиентов.
Ссылка Настройка HttpMessageHandler
Может потребоваться управление конфигурацией внутреннего HttpMessageHandler, используемого клиентом.
IHttpClientBuilder
возвращается при добавлении именованных или типизированных клиентов. Метод расширенияConfigurePrimaryHttpMessageHandler
можно использовать для определения делегата. Делегат используется для создания и настройки основногоHttpMessageHandler
, используемого этим клиентом:
services.AddTransient<Handler1>();
services.AddTransient<Handler2>();
services.AddHttpClient("configured-inner-handler")
.AddHttpMessageHandler<Handler1>()
.AddHttpMessageHandler<Handler2>();
.ConfigurePrimaryHttpMessageHandler(() =>
{
return new HttpClientHandler()
{
AllowAutoRedirect = false,
UseDefaultCredentials = true
};
});
При проверке исходного кода DefaultHttpClientFactory
(который является и IHttpClientFactory
, и IHttpMessageHandlerFactory
зарегистрированным методом AddHttpClient
), выясняется, что нет смысла регистрировать пользовательский IHttpMessageHandlerFactory
, потому что DefaultHttpClientFactory
никогда не требует этого (а напрямую использует свой собственный метод). Конечно, мы могли бы также зарегистрировать собственный IHttpClientFactory
, но есть более простой способ добиться того, что мы хотим.
Идея состоит в том, что DefaultHttpClientFactory
вызывает временную службу HttpMessageHandlerBuilder
во время ее IHttpMessageHandlerFactory
реализации, поэтому все, что нам нужно сделать, это зарегистрировать пользовательский HttpMessageHandlerBuilder
. Например:
public class CustomHttpMessageHandlerBuilder : HttpMessageHandlerBuilder {
public override string Name { get; set; }
public override HttpMessageHandler PrimaryHandler { get; set; }
public override IList<DelegatingHandler> AdditionalHandlers => new List<DelegatingHandler>();
// Our custom builder doesn't care about any of the above.
public override HttpMessageHandler Build() {
return new HttpClientHandler {
// Our custom settings
};
}
}
А затем зарегистрируйте его:
services.AddTransient<HttpMessageHandlerBuilder, CustomHttpMessageHandlerBuilder>();
И это работает.
IServiceCollection
метод расширения с именемAddHttpClient
, который может приниматьDelegatingHandler
, а затемservices.AddSingleton(ctx => new System.Net.Http.HttpClient(handler));
. Проблема в том, что вы можете добавить обработчик только в конструктореHttpClient
. - person JohanP   schedule 02.08.2018