一、前言
前面分享了 .net core HttpClient 使用之掉坑解析(一),今天来分享自定义消息处理HttpMessageHandler
和PrimaryHttpMessageHandler
的使用场景和区别
二、源代码阅读
2.1 核心消息管道模型图
先贴上一张核心MessageHandler 管道模型的流程图,图如下: HttpClient 中的
HttpMessageHandler
负责主要核心的业务,HttpMessageHandler
是由MessageHandler 链表结构组成,形成一个消息管道模式;具体我们一起来看看源代码
2.2 Demo代码演示
再阅读源代码的时候我们先来看下下面注入HttpClient
的Demo 代码,代码如下:
services.AddHttpClient("test")
.ConfigurePrimaryHttpMessageHandler(provider =>
{
return new PrimaryHttpMessageHandler(provider);
})
.AddHttpMessageHandler(provider =>
{
return new LogHttpMessageHandler(provider);
})
.AddHttpMessageHandler(provider =>
{
return new Log2HttpMessageHandler(provider);
});
上面代码中有两个核心扩展方法,分别是ConfigurePrimaryHttpMessageHandler
和AddHttpMessageHandler
,这两个方法大家可能会有疑问是做什么的呢? 不错,这两个方法就是扩展注册自定义的HttpMessageHandler
如果不注册,会有默认的HttpMessageHandler
,接下来我们分别来看下提供的扩展方法,如下图: 图中提供了一系列的
AddHttpMessageHandler
扩展方法和ConfigurePrimaryHttpMessageHandler
的扩展方法。
2.3 AddHttpMessageHandler
我们来看看HttpClientBuilderExtensions
中的其中一个AddHttpMessageHandler
扩展方法,代码如下:
/// <summary> /// Adds a delegate that will be used to create an additional message handler for a named <see cref="HttpClient"/>. /// </summary> /// <param name="builder">The <see cref="IHttpClientBuilder"/>.</param> /// <param name="configureHandler">A delegate that is used to create a <see cref="DelegatingHandler"/>.</param> /// <returns>An <see cref="IHttpClientBuilder"/> that can be used to configure the client.</returns> /// <remarks> /// The <see paramref="configureHandler"/> delegate should return a new instance of the message handler each time it /// is invoked. /// </remarks> public static IHttpClientBuilder AddHttpMessageHandler(this IHttpClientBuilder builder, Func<DelegatingHandler> configureHandler) { if (builder == null) { throw new ArgumentNullException(nameof(builder)); }
if (configureHandler == null) { throw new ArgumentNullException(nameof(configureHandler)); } builder.Services.Configure<HttpClientFactoryOptions>(builder.Name, options => { options.HttpMessageHandlerBuilderActions.Add(b => b.AdditionalHandlers.Add(configureHandler())); }); return builder; }
代码中把自定义的DelegatingHandler
方法添加到HttpMessageHandlerBuilderActions
中,我们再来看看HttpClientFactoryOptions
对象源代码,如下:
/// <summary> /// An options class for configuring the default <see cref="IHttpClientFactory"/>. /// </summary> public class HttpClientFactoryOptions { // Establishing a minimum lifetime helps us avoid some possible destructive cases. // // IMPORTANT: This is used in a resource string. Update the resource if this changes. internal readonly static TimeSpan MinimumHandlerLifetime = TimeSpan.FromSeconds(1);
private TimeSpan _