.NET Core开发日志——HttpClientFactory
当需要向某特定URL地址发送HTTP请求并得到相应响应时,通常会用到HttpClient类。该类包含了众多有用的方法,可以满足绝大多数的需求。但是如果对其使用不当时,可能会出现意想不到的事情。
博客园官方团队就遇上过这样的问题,国外博主也记录过类似的情况,YOU'RE USING HTTPCLIENT WRONG AND IT IS DESTABILIZING YOUR SOFTWARE。
究其缘由是一句看似正确的代码引起的:
using(var client = new HttpClient())
对象所占用资源应该确保及时被释放掉,但是,对于网络连接而言,这是错误的。
原因有二,网络连接是需要耗费一定时间的,频繁开启与关闭连接,性能会受影响;再者,开启网络连接时会占用底层socket资源,但在HttpClient调用其本身的Dispose方法时,并不能立刻释放该资源,这意味着你的程序可能会因为耗尽连接资源而产生预期之外的异常。
所以比较好的解决方法是延长HttpClient对象的使用寿命,比如对其建一个静态的对象:
private static HttpClient Client = new HttpClient();
但从程序员的角度来看,这样的代码或许不够优雅。
所以在.NET Core 2.1中引入了新的HttpClientFactory类。
它的用法很简单,首先是对其进行Ioc的注册:
public void ConfigureServices(IServiceCollection services){services.AddHttpClient();services.AddMvc();
}
然后通过IHttpClientFactory创建一个HttpClient对象,之后的操作如旧,但不需要担心其内部资源的释放:
第一眼瞧去,可能不明白AddHttpClient方法与IHttpClientFactory有什么关系,但查到其源码后就能一目了然:
它的内部为IHttpClientFactory接口绑定了DefaultHttpClientFactory类。
再看IHttpClientFactory接口中关键的CreateClient方法:
HttpClient的创建不再是简单的new HttpClient(),而是传入了两个参数:HttpMessageHandler handler与bool disposeHandler。disposeHandler参数为false值时表示要重用内部的handler对象。handler参数则从上一句的代码可以看出是以名称为键值从一字典中取出,又因为DefaultHttpClientFactory类是通过TryAddSingleton方法注册的,也就意味着其为单例,那么这个内部字典便是唯一的,每个键值对应的ActiveHandlerTrackingEntry对象也是唯一,该对象内部中就包含着handler。
下一句代码StartHandlerEntryTimer(entry);
开启了ActiveHandlerTrackingEntry对象的过期计时处理。默认过期时间是2分钟。
先是将ActiveHandlerTrackingEntry对象传入新的ExpiredHandlerTrackingEntry对象。
public ExpiredHandlerTrackingEntry(ActiveHandlerTrackingEntry other){Name = other.Name;_livenessTracker = new WeakReference(other.Handler);InnerHandler = other.Handler.InnerHandler;
}
在其构造方法内部,handler对象通过弱引用方式关联着,不会影响其被GC释放。
然后新建的ExpiredHandlerTrackingEntry对象被放入专用的队列。
最后开始清理工作,定时器的时间间隔设定为每10秒一次。
上述方法核心是判断是否handler对象已经被GC,如果是的话,则释放其内部资源,即网络连接。
回到最初创建HttpClient的代码,会发现并没有传入任何name参数值。这是受益于HttpClientFactoryExtensions类的扩展方法。
在传入name参数值时,还可以传入一些配置信息:
相关文章:
.Net Core开发日志——Global Tools
.Net Core开发日志——Peachpie
.NET Core开发日志——Middleware
.Net Core Cors中间件解析
.NET Core开发日志——Runtime IDentifier
.NET Core开发日志——从ASP.NET Core Module到KestrelServer
原文地址:https://www.cnblogs.com/kenwoo/p/9333042.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
.NET Core开发日志——HttpClientFactory相关推荐
- .NET Core开发日志——WCF Client
WCF作为.NET Framework3.0就被引入的用于构建面向服务的框架在众多项目中发挥着重大作用.时至今日,虽然已有更新的技术可以替代它,但对于那些既存项目或产品,使用新框架重构的代价未必能找到 ...
- .NET Core开发日志——配置
.NET Core开发日志--配置 原文:.NET Core开发日志--配置 熟悉ASP.NET的开发者一定对web.config文件不陌生.在ASP.NET环境中,要想添加配置参数,一般也都会在此文 ...
- .NET Core开发日志——RequestDelegate
本文主要是对.NET Core开发日志--Middleware的补遗,但是会从看起来平平无奇的RequestDelegate开始叙述,所以以其作为标题,也是合情合理. RequestDelegate是 ...
- .NET Core开发日志——从ASP.NET Core Module到KestrelServer
ASP.NET Core程序现在变得如同控制台(Console)程序一般,同样通过Main方法启动整个应用.而Main方法要做的事情很简单,创建一个WebHostBuilder类,调用其Build方法 ...
- .NET Core开发日志——Runtime IDentifier
.NET Core对于传统.NET开发人员而言是既熟悉又陌生的新平台,所以有时遇上出乎意料的事情也纯属正常情况.这时只需点耐心,多查查资料,努力找到原因,也未尝不是件有意义的体验. 比如当建完一个最简 ...
- mysql odata_.NET Core开发日志之OData(Open Data Protocol)
简述 OData,即Open Data Protocol,是由微软在2007年推出的一款开放协议,旨在通过简单.标准的方式创建和使用查询式及交互式RESTful API. 类库 在.NET Core中 ...
- .NET Core开发日志——结构化日志
在.NET生态圈中,最早被广泛使用的日志库可能是派生自Java世界里的Apache log4net.而其后来者,莫过于NLog.Nlog与log4net相比,有一项较显著的优势,它支持结构化日志. 结 ...
- .NET Core开发日志——Linux版本的SQL Server
SQL Server 2017版本已经可以在Linux系统上安装,但我在尝试.NET Core跨平台开发的时候使用的是Mac系统,所以这里记录了在Mac上安装SQL Server的过程. 最新的SQL ...
- .NET Core开发日志——简述路由
有过ASP.NET或其它现代Web框架开发经历的开发者对路由这一名字应该不陌生.如果要用一句话解释什么是路由,可以这样形容:通过对URL的解析,指定相应的处理程序. 回忆下在Web Forms应用程序 ...
最新文章
- 数据库-ADONET-在数据集DataSet中使用关系对象DataRelation处理关系
- uva 12508 - Triangles in the Grid(几何+计数)
- Entity Framework 实体框架的形成之旅--为基础类库接口增加单元测试,对基类接口进行正确性校验(10)...
- 计算机在岗位上的应用,计算机岗位应用论文.doc
- C/C++面试题—序列化二叉树
- 类型全部为string_TypeScript 高级类型总结(含代码案例)
- (day 33 - 位运算 )剑指 Offer 56 - II. 数组中数字出现的次数 II
- 判断中文文本是否为utf8编码类型的javascript实现_Go语言实现LeetCode算法:393 UTF-8编码校验...
- xp+WinDBG+VMware调试内核
- LFW pairs.txt解释
- 信息论——最大流最小割定理
- Win7系统无法被远程桌面连接如何解决
- R语言笔记--par()函数详解
- WinForm大型企业ERP系统
- 不要因为英语和数学而害怕学习编程.
- 跨境电商战略发展中,流星汇聚分析未来跨境电商发展趋势
- Linuux-alsa-左右声道处理
- 女生考系统集成项目管理工程师合适吗?
- 【蓝桥杯集训100题】scratch绘制蜘蛛网 蓝桥杯scratch比赛专项预测编程题 模拟练习题第05题
- Linux 下安装应用程序
热门文章
- 基于FPGA的异步FIFO设计
- openresty 前端开发进阶一之http后端
- 您是否也想过让你的电脑百毒不侵呢!
- 智能实验室-全能优化(Guardio) 4.0.0.670 beta 8
- 华为云服务器初探二(完结)
- dotnet 将自动代码格式化机器人带入团队 GitLab 平台
- 如何通过 .NETCore 获取 Linux,Mac 的硬件信息?
- 如何在 ASP.NET CORE 中获取客户端 IP ?
- NET问答: Find() 和 Where().FirstOrDefault() 该如何选择 ?
- 龙芯.NET正式发布 稳步推进生态建设