写在前面

上一篇文章讨论了通过在ConfigureServices中调用services.AddHttpClient()方法,并基于此进一步探讨了DefaultHttpClientFactory是如何创建HttpClient实例和HttpMessageHandler实例的,并了解了DefaultHttpClientFactory内部维护者一个定时器和两个HttpMessageHandler对象集合,以定期清理无效的 HttpMessageHandler对象,详细的内容可以点击链接跳转,接下来我会接着前一篇文章继续展开相关讨论。

详细介绍

HttpMessageHandlerBuilder

该类是一个抽象类,起到生成器的作用,可用于用于配置HttpMessageHandler实例。HttpMessageHandlerBuilder会在ServiceCollection中被注册为Transient服务。调用方要为每个要创建的HttpMessageHandler实例检索一个新实例。实现者应该确保每个实例都只使用一次。

HttpMessageHandlerBuilder里面有三个比较重要的属性:

这三个属性意味着每个HttpMessageHandlerBuilder都需要维护自身的HttpMessageHandler实例和管道。

其内部还有一个抽象方法:

当然,内部最核心的方法就是管道的创建过程了,需要传入主派生类自身的HttpMessageHandler和管道列表对象。它会将primaryHandler实例付给管道列表的第一个Item的InnerHandler,其他对象会依此后移,这也为我们自定义HttpMessageHandler(各种中间件)提供了无限可能。

相关实现如下:

接下来我们看一下HttpMessageHandlerBuilder一个派生类DefaultHttpMessageHandlerBuilder,其构造函数会传入IServiceProvider实例,我们的自定义操作也可以参照这个类。

关于Build方法的实现如下,比较简单主要是调用了CreateHandlerPipeline方法:

ITypedHttpClientFactory

这是一个抽象工厂,该组件可以使用给定逻辑名称的自定义配置创建类型化HttpClient实例,与命名方式创建HttpClient具有相同的的功能。类型化客户端可能用于单个后端终结点,并封装此终结点的所有处理逻辑。另一个优势是它们使用 DI 被注入到应用中需要的位置,下一篇文章会再次讨论相关功能。

我们首先看一下调用方式:

可以看出此处的调用与普通的HttpClient没有什么太大区别,只是增加了一个泛型标记,而且该类型没有特殊的要求,只要是个类就行。其内部依然调用AddHttpClient(services),但它调用了另一个扩展方法,如下所示:

可以看到最终的代码调用了ITypedHttpClientFactory的CreateClient方法,Microsoft.Extensions.Http包中有一个默认的ITypedHttpClientFactory派生类,DefaultTypedHttpClientFactory<TClient>,该类提供了了构造函数用于接收IServiceProvider实例,以及一个内部类声明的缓存对象,该对象十分重要,它被注册为singleton类型,已达到全局使用,并可以充当相关实例激活时的对象池。它也允许它的外部类注册为transient,这样它就不会在应用根服务提供程序上被关掉了。

相关代码如下:

内部缓存对象:

最后我们看一下源码中提供的范例:

.NET Core 3.0之深入源码理解HttpClientFactory(二)相关推荐

  1. .NET Core 3.0之深入源码理解Host(二)

    写在前面 停了近一个月的技术博客,随着正式脱离996的魔窟,接下来也正式恢复了.本文从源码角度进一步讨论.NET Core 3.0 中关于Host扩展的一些技术点,主要内容是关于创建Long Run ...

  2. .NET Core 3.0之深入源码理解HttpClientFactory(一)

    写在前面 创建HttpClient实例的时候,在内部会创建HttpMessageHandler链,我们知道HttpMessageHandler是负责建立连接的抽象处理程序,所以HttpClient的维 ...

  3. .NET Core 3.0之深入源码理解Startup的注册及运行

    开发.NET Core应用,直接映入眼帘的就是Startup类和Program类,它们是.NET Core应用程序的起点.通过使用Startup,可以配置化处理所有向应用程序所做的请求的管道,同时也可 ...

  4. .NET Core 3.0之深入源码理解HealthCheck(一)

    写在前面 我们的系统可能因为正在部署.服务异常终止或者其他问题导致系统处于非健康状态,这个时候我们需要知道系统的健康状况,而健康检查可以帮助我们快速确定系统是否处于正常状态.一般情况下,我们会提供公开 ...

  5. .NET Core 3.0之深入源码理解ObjectPool(一)

    写在前面 对象池是一种比较常用的提高系统性能的软件设计模式,它维护了一系列相关对象列表的容器对象,这些对象可以随时重复使用,对象池节省了频繁创建对象的开销. 它使用取用/归还的操作模式,并重复执行这些 ...

  6. .NET Core 3.0之深入源码理解Kestrel的集成与应用(二)

    前言 前一篇文章主要介绍了.NET Core继承Kestrel的目的.运行方式以及相关的使用,接下来将进一步从源码角度探讨.NET Core 3.0中关于Kestrel的其他内容,该部分内容,我们无需 ...

  7. .NET Core 3.0之深入源码理解Kestrel的集成与应用(一)

    写在前面 ASP.NET Core 的 Web 服务器默认采用Kestrel,这是一个基于libuv(一个跨平台的基于Node.js的异步I/O库)的跨平台.轻量级的Web服务器. 在开始之前,先回顾 ...

  8. .NET Core 3.0之深入源码理解Configuration(一)

    微软在.NET Core里设计出了全新的配置体系,并以非常灵活.可扩展的方式实现.从其源码来看,其运行机制大致是,根据其Source,创建一个Builder实例,并会向其添加Provider,在我们使 ...

  9. .NET Core 3.0之深入源码理解ObjectPool(二)

    写在前面 前文主要介绍了ObjectPool的一些理论基础,本文主要从源码角度理解Microsoft.Extensions.ObjectPool是如何实现的.下图为其三大核心组件图: 核心组件 Obj ...

最新文章

  1. 微信jssdk批量添加卡券接口(踩坑经验)
  2. SSL证书安装指南 - Winodws 2003 Server IIS 6.0
  3. 2021年改造数据中心未来最需要的技能
  4. Oracle--序列和触发器的使用
  5. xmm1是什么器件_数字电路实验指导书
  6. 解决点击事件让背景变红,在点击背景变正常,并且可以多选的效果
  7. Spring EclipseLink NoSQL - 使用MongoDB和Oracle NoSQL DB构建
  8. UBC、谷歌联合Hinton等提出3D点云的无监督胶囊网络,多任务上实现SOTA
  9. 使用go来做系统,如何比java node php 更 简单
  10. Zabbix(二)通过API在zabbix系统中查看、删除及创建监控主机
  11. 解决LInux更新慢的问题, 更换国内软件源
  12. Linux应用基本命令实验,实验二 linux基本命令的使用
  13. 如何注册MSN(Microsoft ID)
  14. unity中静态变量的使用
  15. 利用skipList(跳表)来实现排序(待补充)
  16. 微观角度上,宇宙膨胀的影响是什么?
  17. 面试官:说说什么是 Java 内存模型(JMM)?
  18. 网站ssl证书错误是为什么?要怎么解决ssl证书错误
  19. 电池BMS软件架构设计和电池安全标准及测试
  20. Stream流和Optional

热门文章

  1. Effective C# 原则35:选择重写函数而不是使用事件句柄(译)
  2. java语言不用担心内存吗_不用担心智能手机的电池,只需使用它
  3. esxi.主机配置上联端口_为什么现代的电脑机箱仍然具有USB 2.0端口?
  4. 【C】C语言结构体指针的语法
  5. Vim的NerdTree插件
  6. PHP个人博客项目------切切歆语博客
  7. C++获取本机的ip地址程序
  8. Framework Design Studio 发布了
  9. 《版式设计——日本平面设计师参考手册》—第1章应用对象样式
  10. 李洪强经典面试题146-网络