是否有方法将处理程序添加到ASP.NET Core中的默认HTTP客户端?像这样的东西?
.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
的源代码(即AddHttpClient
方法注册的IHttpClientFactory
和IHttpMessageHandlerFactory
(后发现,注册自定义IHttpMessageHandlerFactory
没有用,因为DefaultHttpClientFactory
从不需要它(而是直接使用自己的方法(。当然,我们也可以注册自定义IHttpClientFactory
,但有一种更简单的方法可以实现我们想要的。
其思想是DefaultHttpClientFactory
在其IHttpMessageHandlerFactory
实现期间调用临时服务HttpMessageHandlerBuilder
,所以我们所要做的就是注册一个自定义的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>();
它是有效的。