当需要向某特定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相关推荐

  1. .NET Core开发日志——WCF Client

    WCF作为.NET Framework3.0就被引入的用于构建面向服务的框架在众多项目中发挥着重大作用.时至今日,虽然已有更新的技术可以替代它,但对于那些既存项目或产品,使用新框架重构的代价未必能找到 ...

  2. .NET Core开发日志——配置

    .NET Core开发日志--配置 原文:.NET Core开发日志--配置 熟悉ASP.NET的开发者一定对web.config文件不陌生.在ASP.NET环境中,要想添加配置参数,一般也都会在此文 ...

  3. .NET Core开发日志——RequestDelegate

    本文主要是对.NET Core开发日志--Middleware的补遗,但是会从看起来平平无奇的RequestDelegate开始叙述,所以以其作为标题,也是合情合理. RequestDelegate是 ...

  4. .NET Core开发日志——从ASP.NET Core Module到KestrelServer

    ASP.NET Core程序现在变得如同控制台(Console)程序一般,同样通过Main方法启动整个应用.而Main方法要做的事情很简单,创建一个WebHostBuilder类,调用其Build方法 ...

  5. .NET Core开发日志——Runtime IDentifier

    .NET Core对于传统.NET开发人员而言是既熟悉又陌生的新平台,所以有时遇上出乎意料的事情也纯属正常情况.这时只需点耐心,多查查资料,努力找到原因,也未尝不是件有意义的体验. 比如当建完一个最简 ...

  6. mysql odata_.NET Core开发日志之OData(Open Data Protocol)

    简述 OData,即Open Data Protocol,是由微软在2007年推出的一款开放协议,旨在通过简单.标准的方式创建和使用查询式及交互式RESTful API. 类库 在.NET Core中 ...

  7. .NET Core开发日志——结构化日志

    在.NET生态圈中,最早被广泛使用的日志库可能是派生自Java世界里的Apache log4net.而其后来者,莫过于NLog.Nlog与log4net相比,有一项较显著的优势,它支持结构化日志. 结 ...

  8. .NET Core开发日志——Linux版本的SQL Server

    SQL Server 2017版本已经可以在Linux系统上安装,但我在尝试.NET Core跨平台开发的时候使用的是Mac系统,所以这里记录了在Mac上安装SQL Server的过程. 最新的SQL ...

  9. .NET Core开发日志——简述路由

    有过ASP.NET或其它现代Web框架开发经历的开发者对路由这一名字应该不陌生.如果要用一句话解释什么是路由,可以这样形容:通过对URL的解析,指定相应的处理程序. 回忆下在Web Forms应用程序 ...

最新文章

  1. 数据库-ADONET-在数据集DataSet中使用关系对象DataRelation处理关系
  2. uva 12508 - Triangles in the Grid(几何+计数)
  3. Entity Framework 实体框架的形成之旅--为基础类库接口增加单元测试,对基类接口进行正确性校验(10)...
  4. 计算机在岗位上的应用,计算机岗位应用论文.doc
  5. C/C++面试题—序列化二叉树
  6. 类型全部为string_TypeScript 高级类型总结(含代码案例)
  7. (day 33 - 位运算 )剑指 Offer 56 - II. 数组中数字出现的次数 II
  8. 判断中文文本是否为utf8编码类型的javascript实现_Go语言实现LeetCode算法:393 UTF-8编码校验...
  9. xp+WinDBG+VMware调试内核
  10. LFW pairs.txt解释
  11. 信息论——最大流最小割定理
  12. Win7系统无法被远程桌面连接如何解决
  13. R语言笔记--par()函数详解
  14. WinForm大型企业ERP系统
  15. 不要因为英语和数学而害怕学习编程.
  16. 跨境电商战略发展中,流星汇聚分析未来跨境电商发展趋势
  17. Linuux-alsa-左右声道处理
  18. 女生考系统集成项目管理工程师合适吗?
  19. 【蓝桥杯集训100题】scratch绘制蜘蛛网 蓝桥杯scratch比赛专项预测编程题 模拟练习题第05题
  20. Linux 下安装应用程序

热门文章

  1. 基于FPGA的异步FIFO设计
  2. openresty 前端开发进阶一之http后端
  3. 您是否也想过让你的电脑百毒不侵呢!
  4. 智能实验室-全能优化(Guardio) 4.0.0.670 beta 8
  5. 华为云服务器初探二(完结)
  6. dotnet 将自动代码格式化机器人带入团队 GitLab 平台
  7. 如何通过 .NETCore 获取 Linux,Mac 的硬件信息?
  8. 如何在 ASP.NET CORE 中获取客户端 IP ?
  9. NET问答: Find() 和 Where().FirstOrDefault() 该如何选择 ?
  10. 龙芯.NET正式发布 稳步推进生态建设