向 ASP.NET Core 中的默认 http 客户端添加处理程序

Sha*_*ags 7 c# dotnet-httpclient asp.net-core asp.net-core-2.0

有没有办法将处理程序添加到 ASP.NET Core 中的默认 HTTP 客户端?像这样的东西?

.AddHttpClient()
.AddHttpMessageHandler<Handler1>()
.AddHttpMessageHandler<Handler2>();
Run Code Online (Sandbox Code Playgroud)

Nko*_*osi 17

文档指出,您只能添加处理程序或将最内部的处理程序配置到命名或类型客户端。

参考配置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
        };
    });
Run Code Online (Sandbox Code Playgroud)


Mu-*_*sai 8

在检查DefaultHttpClientFactory(既是方法IHttpClientFactory又是IHttpMessageHandlerFactory注册AddHttpClient方法)的源代码时,发现注册自定义是没有用的,IHttpMessageHandlerFactory因为DefaultHttpClientFactory从不需要它(而是直接使用它自己的方法)。当然我们也可以注册一个 custom IHttpClientFactory,但是有一个更简单的方法来实现我们想要的。

这个想法是在其实现过程中DefaultHttpClientFactory调用瞬态服务,所以我们要做的就是注册一个自定义的. 例如:HttpMessageHandlerBuilderIHttpMessageHandlerFactoryHttpMessageHandlerBuilder

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
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

然后注册它:

services.AddTransient<HttpMessageHandlerBuilder, CustomHttpMessageHandlerBuilder>();
Run Code Online (Sandbox Code Playgroud)

它有效。