不简单的工厂:实际体验 .NET Core 2.1 新生物 HttpClientFactory
在 HttpClientFactory 出生之前,由于 HttpClient 臭名昭著的“dispose之后4分钟TCP连接才会被关闭”问题(详情),只能使用单例或静态的 HttpClient ,比如
private static readonly HttpClient _httpClient = new HttpClient() { BaseAddress = new Uri("www.cnblogs.com") };
但这会带来一个副作用,如果 dns 解析更新了,HttpClient 不会自动更新IP地址。我们就被这个问题坑过,当时一个 web api 的 IP 地址变更了,不得不重启所有调用这个 web api 的应用。
随着 .NET Core 2.1 的发布,HttpClientFactory 横空出世,有效地解决了 HttpClient 的生命周期与对应的TCP连接管理的问题。
今天实际体验了一下,将一个项目中使用静态 HttpClient 的地方改为使用 HttpClientFactory 。
由于所在项目的 target framework 是 netstandard 2.0,所以需要安装包含 HttpClientFactory 的 nuget 包 Microsoft.Extensions.Http (如果是引用了 Microsoft.AspNetCore.App 的 netcoreapp2.1 项目,则不需要安装)。
首先,将之前定义静态 HttpClient 的地方改为通过构造函数依赖注入:
public class UCenterService : IUCenterService
{
private ILogger _logger;
private readonly HttpClient _httpClient; public UCenterService(ILoggerFactory loggerFactory, HttpClient httpClient)
{
_logger = loggerFactory.CreateLogger<UCenterService>();
_httpClient = httpClient;
}
}
然后在 Startup 的 ConfigureServices 中通过 HttpClientFactory 提供的扩展方法进行注册(这里用的是 typed client 方式):
services.AddHttpClient<IUCenterService, UCenterService>(c =>
{
c.BaseAddress = new Uri("http://www.cnblogs.com");
});
通过这两步操作后就轻松搞定 HttpClientFactory 的运用,并在实际项目中验证通过。
看看上面的注册代码,感觉好强大,可以在注册时根据类型(UCenterService)配置对应的 HttpClient 实例。
除此之外,在注册时还可以设置 HttpMessageHandler 实例被重用(也就是TCP连接重用)的生命周期(默认是2分钟),正是 HttpMessageHandler 实例被定期释放解决了 dns 解析更新的问题。
services.AddHttpClient<IUCenterService, UCenterService>(c =>
{
c.BaseAddress = new Uri("http://www.cnblogs.com");
})
.SetHandlerLifetime(TimeSpan.FromMinutes());
而且集成了 Polly ,可以配置策略对瞬时故障进行处理(需要安装 nuget 包 Microsoft.Extensions.Http.Polly )
services.AddHttpClient<IUCenterService, UCenterService>(c =>
{
c.BaseAddress = new Uri("http://www.cnblogs.com");
})
.SetHandlerLifetime(TimeSpan.FromMinutes())
.AddTransientHttpErrorPolicy(p => p.WaitAndRetryAsync(, _ => TimeSpan.FromMilliseconds()));
还有强大的 outgoing request middleware pipeline ,目前还没用到,留待以后体验。
参考资料:
1)HttpClientFactory in ASP.NET Core 2.1 (Part 1) An Introduction to HttpClientFactory
2)HttpClientFactory in ASP.NET Core 2.1 (Part 2) Defining Named and Typed Clients
3)HttpClientFactory in ASP.NET Core 2.1 (Part 3) Outgoing request middleware with handlers
4)HttpClientFactory in ASP.NET Core 2.1 (Part 4) Integrating with Polly for transient fault handling
不简单的工厂:实际体验 .NET Core 2.1 新生物 HttpClientFactory的更多相关文章
- 在docker中初次体验.net core 2.0
		
.net core的跨平台有了Linux,不能没有docker……网上的系列文章一大推,特别是docker还有了中文官网:https://www.docker-cn.com/ .上面说的很清楚了,这里 ...
 - 在ubuntu16.04中再次体验.net core 2.0
		
在上一篇文章中在ubuntu16.04中初次体验.net core 2.0 简单介绍了一下ubuntu中运行.net core 2.0.配置nginx反向代理以及安装supervisor守护进程……本 ...
 - .net core 中使用httpclient,HttpClientFactory的问题
		
Microsoft 在.Net Framework 4.5中引入了HttpClient,并且是在.NET服务器端代码中使用Web API的最常用方法.但它有一些严重的问题,如释放HttpClient对 ...
 - 在ubuntu16.04中初次体验.net core 2.0
		
.net core运行在Linux中的例子.文章已经很多了,看了一些之后也想体验一下,顺便记录一下…… 环境:win10 1709.它内置的Linux子系统(这里安装的是Ubuntu 16.04) 一 ...
 - 工厂参观记:.NET Core 中 HttpClientFactory 如何解决 HttpClient 臭名昭著的问题
		
在 .NET Framework 与 .NET Core 中 HttpClient 有个臭名昭著的问题,HttpClient 实现了 IDispose 接口,但当你 Dispose 它时,它不会立即关 ...
 - 体验.NET Core使用IKVM对接Java
		
前言 与第三方对接最麻烦的是语言不同,因语言不同内置实现相关标准加密算法还是略微有所差异,对接单点登录场景再寻常不过,由于时间紧迫且对接方使用Java,所以留给我对接开发和联调的时间本就不多,于是乎, ...
 - 体验.NET Core 命令行应用程序-CommandLineUtils
		
前言 在我们开发中可能需要设计一次性应用程序,这些实用程序可以利用接近原始源代码的优势,但可以在与主Web应用程序完全独立的安全性上下文中启动.具体在 [管理过程](https://12factor. ...
 - .net core 控制台下使用HttpClientFactory封装
		
HttpClientFactory封装,如有错误请指出,谢谢! using System; using System.Collections.Generic; using System.Net.Htt ...
 - .NET Core 2.0体验
		
.NET Core 2.0预览版及.NET Standard 2.0 Preview 这个月也就要发布了. 具体相关信息可以查看之前的文章.NET Core 2.0及.NET Standard 2.0 ...
 
随机推荐
- centos 中查找文件、目录、内容
			
1.查找文件 find / -name 'filename'12.查找目录 find / -name 'path' -type d13.查找内容 find . | xargs grep -ri 'co ...
 - golang 使用pprof和go-torch做性能分析
			
软件开发过程中,项目上线并不是终点.上线后,还要对程序的取样分析运行情况,并重构现有的功能,让程序执行更高效更稳写. golang的工具包内自带pprof功能,使找出程序中占内存和CPU较多的部分功能 ...
 - 移动端禁止页面拖动 h5禁止拖动页面
			
PC上css控制滚动仅css("overflow","hidden")已足够. 但是,如果在Mobile上还是可以拖动的!所以需要监听touchmove事件. ...
 - Native App开发 与Web App开发(原生与web开发优缺点)
			
Native App开发 Native App开发即我们所称的传统APP开发模式(原生APP开发模式),该开发针对IOS.Android等不同的手机操作系统要采用不同的语言和框架进行开发,该模式通常是 ...
 - linux驱动(续)
			
网络通信 --> IO多路复用之select.poll.epoll详解 IO多路复用之select.poll.epoll详解 目前支持I/O多路复用的系统调用有 select,psel ...
 - Nios II 程序固化(如何下载elf文件)
			
Nios II 程序固化(如何下载elf文件) 2018年10月15日 21:37:32 瓜儿不甜 阅读数:723 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...
 - 【CFD之道】2018年原创文章汇总
			
以下是公众号CFD之道2018年的全部原创文章,共计210篇. 1 Fluent验证案例[60篇] Fluent验证案例02:通过均匀热通量管道层流流动 Fluent验证案例03:管道中湍流流动压降计 ...
 - centos 7 下的 service部署
			
在centos 7下部署service一般涉及到jar包部署, service脚本. 数据存贮路径, log存贮路径 jar包部署 /usr/local/app/app1/app1.jar servi ...
 - 【WPF】ImageMagick调节图片的颜色
			
需求:打开一张图片后,自由调节图片的颜色(色调). 思路:读取显示一张图片后,用ColorPicker取色器选择一种颜色,之后将图片的色调调节为该颜色. 工具: 1.图像工具 ImageMagick( ...
 - js对象与字符串的想到转换
			
js JSON.stringify(jsObj); 对象转字符串JSON.parse(str); 字符串转对象