ASP.NET Core HttpClient的实现原理系列四

HttpClient 组件最早出现在 .NET Framework中,它为开发者提供了一个方便、灵活且强大的方式来进行 HTTP 请求,在 .NET Framework 中,HttpClient 常常用于执行与 Web 服务的通信,获取数据或与 RESTful API 进行交互,在不同的平台进行了衍生出不同的处理方式

.NET Core平台

我们查看GitHub上微软提供的源代码找到该类,我们从下面的目录找到HttpClient类,该类继承了HttpMessageInvoker类:

5b17ddb55c49b55a740c3dc29d0c67ef.png

41e7ce48f551d0e6c0e6f5f42840ff83.png

我们看到HttpMessageInvoker类中引用HttpMessageHandler类,我们再继续看一下这个类的源代码:

e2305c28907db7472396a402e0425fa3.png

HttpMessageHandler是一个抽象类,我们查看一下微软官方文档对该类的解释:

b2af2ac98947221f5d72dea56e2c08b9.png

HttpMessageHandler是一个HTTP消息处理的基类,该类派生出很多子类,我们返回到HttpClient源代码,发现构造函数默认初始化的是一个HttpClientHandler对象:

60396f5aba250dbfdecfd3525421675a.png

我们进入HttpClientHandler类:

c60c33520d241f35b8d0f58c62a5d7c3.png

我们可以在HttpClientHandler类中可以看到根据不同平台选择了不同的处理器(BrowserHttpHandler和SocketsHttpHandler)

BrowserHttpHandler

我们查看了一下微软的官方文档并没有找到关于该类的说明,我猜测针对 WebAssembly 和浏览器环境处理器,通常在基于浏览器的 .NET 平台(例如 Blazor WebAssembly)中使用

源代码:https://github.com/dotnet/runtime/tree/21b4a8585362c1bc12d545b63e62a0d9dd4e8673/src/libraries/System.Net.Http/src/System/Net/Http/BrowserHttpHandler

SocketsHttpHandler

我们查看一下微软官方文档:

64e9c8b2eb7b16ea34dc640495bbc446.png

从.NET Core 2.1开始,HttpClient使用SocketsHttpHandler 类作为默认消息处理器

提供了用于更高级别的 HTTP 网络类(如 HttpClient)的实现,与先前实现相比,性能显著提升,消除了平台依赖性,简化了部署和维护。例如,在 macOS 和 Linux 上,对于 .NET Core,不再依赖于 libcurl

源代码:

https://github.com/dotnet/runtime/tree/21b4a8585362c1bc12d545b63e62a0d9dd4e8673/src/libraries/System.Net.Http/src/System/Net/Http/SocketsHttpHandler

我们可以看到.NET Core中微软对其进行了大量改造,在提升性能的同时兼容多个平台

在HttpClientHandler本质上是对SocketsHttpHandler的封装,我们在创建HttpClient的时候默认使用了该处理器,我们在创建的时候还可以手动指定别的处理器

.NET Framework & Mono

默认情况下,在 .NET Framework 和 Mono 中,使用 HttpWebRequest 来发送请求到服务器。可以通过在构造函数的一个重载中使用 HttpMessageHandler 参数指定不同的处理程序来修改此行为,我们来看一下HttpMessageHandler派生类,我们查看微软的官方文档可以看到有如下几个派生类:

2f2a02229676bce50b8a449ff44b43e8.png

相信很多资深程序员会用到WebRequest和WebResponse类,包括笔者在内10年前非常喜欢用这两个类,那时候还是使用的.NET Framework,我们来简单看一下这几个类:我们查看一下官方文档发现有4个类继承于该类:

c9bba14b728d992db451308e2ca0e364.png

与其对应的是4个Response类

81a29742d47856cdf0032fd3742f9b96.png

由于.NET Framework是不开源的,后期微软将源代码公开的github上,让开发人员更好理解内部的实现原理,我们通过代码来查看一下.NET Framework内部是如何实现的,实现原理基本相同,我们找到HttpClientHandler.cs类:

02925dfd2c9876d3efa4f2121f83dd90.png

SendAsync方法内部调用了CreateAndPrepareWebRequest,我们进入CreateAndPrepareWebRequest方法查看一下该方法源代码:

c8f2e21142390dc96ea1472f49072d69.png

我们从源代码内部发现使用WebRequest和WebResponse类

HttpClient 是一个高层级 API,封装了在其运行的每个平台上可用的较低级别功能

f10e28136c7b31f97637b6fe3bb61648.png

我们从这个例子中可以看.NET Framework到.NET Core 再到现在.NET,用户API层的感知并不是特别大,运行时进行了很多改进和优化,这也是.NET目前性能得到重大改进的原因

关于HttpClient系列的源代码地址:https://github.com/bingbing-gui/Asp.Net-Core-Skill/tree/master/Fundamentals/AspNetCore.HttpRequest

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的医院后台管理系统实现了病房管理、病例管理、处方管理、字典管理、公告信息管理、患者管理、药品管理、医生管理、预约医生管理、住院管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让医院后台管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值