Добавление обработчика к http-клиенту по умолчанию в ASP.NET Core

Есть ли способ добавить обработчики к HTTP-клиенту по умолчанию в ASP.NET Core? Что-то вроде этого?

.AddHttpClient()
.AddHttpMessageHandler<Handler1>()
.AddHttpMessageHandler<Handler2>();

person Shags    schedule 01.08.2018    source источник
comment
Вы можете добавить к IServiceCollection метод расширения с именем AddHttpClient, который может принимать DelegatingHandler, а затем services.AddSingleton(ctx => new System.Net.Http.HttpClient(handler));. Проблема в том, что вы можете добавить обработчик только в конструкторе HttpClient.   -  person JohanP    schedule 02.08.2018
comment
Действительно, помните, что использование синглтона вместо IHttpClientFactory не рекомендуется для многих приложений (docs.microsoft.com/en-us/aspnet/core/fundamentals/). Но, как всегда, это зависит от вашего варианта использования и вашей кодовой базы.   -  person Kewin Remy    schedule 26.02.2021


Ответы (2)


В документации указано, что вы можете добавлять обработчики или настраивать самый внутренний обработчик только для именованных или типизированных клиентов.

Ссылка Настройка 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
        };
    });
person Nkosi    schedule 02.08.2018

При проверке исходного кода 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>();

И это работает.

person Mu-Tsun Tsai    schedule 17.04.2020