不简单的工厂:实际体验 .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 ...
随机推荐
- Log4j/Log4j2自定义Appender来实现日志级别计数统计及监控
一.简述 本文主要讲如何基于Log4j2来实现自定义的Appender.一般用途是用于Log4j2自带的Appender不足以满足我们的需求,或者需要我们对日志进行拦截统计等操作时,需要我们自定义Ap ...
- ffmpeg 、Vlc参数
ffmpeg.exe -loglevel error -probesize 32 -vsync passthrough -framerate 20 -f gdigrab -i desktop -fil ...
- 中文分词工具thulac4j发布
1. 介绍 thulac4j是THULAC的Java 8工程化实现,具有分词速度快.准.强的特点:支持 自定义词典 繁体转简体 停用词过滤 若想在项目中使用thulac4j,可添加依赖: <de ...
- 性能测试工具--SIEGE安装及使用简介 siege压力测试
官方网站http://www.joedog.org/ 概述 Siege是一个多线程http负载测试和基准测试工具.它有3种操作模式: 1) Regression (when invoked by bo ...
- spring相关面试题
1.spring有依赖的bean,怎么加载? 2.spring怎么解决循环依赖? https://blog.csdn.net/u010853261/article/details/77940767 h ...
- 【转】导致SQL执行慢的原因
索引对大数据的查询速度的提升是非常大的,Explain可以帮你分析SQL语句是否用到相关索引. 索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左 ...
- PowerDesigner 中模型设计导出Excel表格
今天项目做设计,客户要看数据设计,需要到处Excel表格.去网上搜索下,把使用总结如下: 已经完成设计的pd设计 打开pd,快捷键Ctrl + Shift + X或者Tools>Exectue ...
- timer计算两个方法执行时间
>>> from timeit import Timer >>> Timer("temp = x; x = y; y = temp", &quo ...
- IDEA-各模块间引用出现问题的解决方法
1 点击项目右上角的Project Structure 2 选择Modules->父项目->点击右上角的加号->添加需要依赖的模块
- OpenGL——OpenCV与SOIL读取图片进行纹理贴图
使用OpenCV读取图片代码如下 img = imread(m_fileName); if (img.empty()) { fprintf(stderr, "Can not load ima ...