不简单的工厂:实际体验 .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 ...
随机推荐
- ShrePoint 迁移域控
背景: 客户的AD服务器换掉,重新安装AD,SharePoint服务器重新加入域后,将所有服务账号换成新域的账号. 虽然SP的应用程序采用的是表单认证,但是,用户(包括管理员)访问站点,添加数据的时候 ...
- Nginx——location常见配置指令,alias、root、proxy_pass
1.[alias] 别名配置,用于访问文件系统,在匹配到location配置的URL路径后,指向[alias]配置的路径.如: location /test/ { alias /home/sftp/i ...
- github上总结的python资源列表【转】
Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-python 是 vinta 发起维护的 Python 资源列 ...
- Linux-进程描述符 task_struct 详解
为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块 PCB(Process Control Block),它是进程实体的一部分,是操作系统中最重要的记录性数据结构.它是进程 ...
- mysql出现unblock with 'mysqladmin flush-hosts'
朋友发来消息,说一个系统应用登录的时候提示连接超时,让帮忙处理一下.问他应用和数据库是否都正常,回复说数据库好像没有问题,但是应用日志报无法连接数据库. 数据库版本是:5.5.53 让他telnet数 ...
- 【Java】Java8的Lambda入门记录
简化定义匿名实现类 匿名实现类的传统方式 创建一个线程,需要实现Runnable接口,并实现public void run()方法,用传统的方式是这样的: public static void mai ...
- mybatis #与$区别
mybatis #与$区别 #{}变量解析到SQL有带引号字符串:如查询条件变量如:select * from user where name = #{name}; 为:select * from u ...
- 基于vue-cli配置手淘的lib-flexible + rem,实现移动端自适应
没接触过flexible的建议先看看大漠的这篇文章这样你才会知道长度为什么用rem,而字体要用px 安装flexible npm install lib-flexible --save 引入flexi ...
- Ubuntu安装Sqlite报错:No module named 'ConfigParser'
安装命令:`sudo apt install sqlite` 原因,我把系统默认的python版本改为了python3 改为python2即可,用update-alternatives命令,见此文(方 ...
- idea checkout 项目
1. 2.添加一个连接 选择远程目录checkout , 然后选择本地目录 但是这样会创建一个新的projectwindow 如果要创建为module的话 1.手动引入从svn check的 ...