架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 968|回复: 0

[资料] .NET/C# HttpClient 源码简单分析

[复制链接]
发表于 2023-6-24 13:05:41 | 显示全部楼层 |阅读模式
需求:在微服务架构中,服务之间调用经常会采用 HTTP 协议,一般使用 HttpClient 类发出 HTTP 请求,或者使用 Refit.HttpClientFactory、WebApiClientCore 第三方基于 HttpClient 封装的类库。

关于 HttpClient 使用,请参考:https://learn.microsoft.com/zh-cn/dotnet/fundamentals/networking/http/httpclient

HttpClient 源码:https://source.dot.net/#System.Net.Http/System/Net/Http/HttpClient.cs

HttpClient 无参构造函数中,默认实例化了 HttpClientHandler 对象,HttpClientHandler 继承并实现 HttpMessageHandler 抽象类。默认流程:HttpClient -> HttpClientHandler -> SocketsHttpHandler -> ...

QQ截图20230624123827.jpg

根据源码分析,继承于 HttpMessageHandler 的对象是对 HttpClient 发送 HTTP 请求的具体实现。HttpClient 将 HttpRequestMessage 对象传入,再接收 HttpResponseMessage 对象返回内容。

尝试新建 TestHttpHandler 类,继承 HttpMessageHandler 抽象类并实现 SendAsync 方法,然后在 HttpClient 构造函数中实例化,代码如下:

如下图:

QQ截图20230624130634.jpg

虽然调用 HttpClient 发送 GET 请求,但是具体实现 SendAsync 方法中,并没有发送 HTTP 请求,没有产生网络流程,所以您把网线拔掉,程序也可以正常运行

使用 HttpClient 对象时,基础套接字不会立即释放,这可能会导致套接字耗尽问题。微软意识到了这个问题,建议大家在 ASP.NET Core 项目中使用 IHttpClientFactory 来创建 HttpClient 对象,IHttpClientFactory 将工厂创建的 HttpMessageHandler 实例汇集到池中,以减少资源消耗。 新建 HttpClient 实例时,可能会重用池中的 HttpMessageHandler 实例(如果生存期尚未到期的话)。

ASP.NET Core(十五)使用 HttpClient 发送 HTTP 请求
https://www.itsvse.com/thread-10311-1-1.html

.NET 的 IHttpClientFactory:https://learn.microsoft.com/zh-cn/dotnet/core/extensions/httpclient-factory

ASP.NET Core 有管道中间件的概念,其实 HttpClient 中借助 Delegating Handler:委托处理器也有管道中间件的概念,如下图:

QQ截图20230624124824.jpg

利用该特点,我们可以实现对请求、响应的拦截,例如:在请求前统一增加 Token 认证、记录请求和响应的耗时、响应数据包装等等。

只需要继承 DelegatingHandler 类,重写 SendAsync 方法即可。

QQ截图20230624125154.jpg QQ截图20230624130504.jpg

记录 HTTP 请求耗时,代码如下:

调用 IHttpClientFactory 创建 HttpClient 并发送请求,如下图:

QQ截图20230624130401.jpg

(完)




上一篇:Web 开发之 ajax-hook 拦截所有 XMLHttpRequest 请求
下一篇:.NET/C# 方法参数 NULL 空检查
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-28 09:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表