在 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

5)HttpClientFactory 微软官方文档

不简单的工厂:实际体验 .NET Core 2.1 新生物 HttpClientFactory的更多相关文章

  1. 在docker中初次体验.net core 2.0

    .net core的跨平台有了Linux,不能没有docker……网上的系列文章一大推,特别是docker还有了中文官网:https://www.docker-cn.com/ .上面说的很清楚了,这里 ...

  2. 在ubuntu16.04中再次体验.net core 2.0

    在上一篇文章中在ubuntu16.04中初次体验.net core 2.0 简单介绍了一下ubuntu中运行.net core 2.0.配置nginx反向代理以及安装supervisor守护进程……本 ...

  3. .net core 中使用httpclient,HttpClientFactory的问题

    Microsoft 在.Net Framework 4.5中引入了HttpClient,并且是在.NET服务器端代码中使用Web API的最常用方法.但它有一些严重的问题,如释放HttpClient对 ...

  4. 在ubuntu16.04中初次体验.net core 2.0

    .net core运行在Linux中的例子.文章已经很多了,看了一些之后也想体验一下,顺便记录一下…… 环境:win10 1709.它内置的Linux子系统(这里安装的是Ubuntu 16.04) 一 ...

  5. 工厂参观记:.NET Core 中 HttpClientFactory 如何解决 HttpClient 臭名昭著的问题

    在 .NET Framework 与 .NET Core 中 HttpClient 有个臭名昭著的问题,HttpClient 实现了 IDispose 接口,但当你 Dispose 它时,它不会立即关 ...

  6. 体验.NET Core使用IKVM对接Java

    前言 与第三方对接最麻烦的是语言不同,因语言不同内置实现相关标准加密算法还是略微有所差异,对接单点登录场景再寻常不过,由于时间紧迫且对接方使用Java,所以留给我对接开发和联调的时间本就不多,于是乎, ...

  7. 体验.NET Core 命令行应用程序-CommandLineUtils

    前言 在我们开发中可能需要设计一次性应用程序,这些实用程序可以利用接近原始源代码的优势,但可以在与主Web应用程序完全独立的安全性上下文中启动.具体在 [管理过程](https://12factor. ...

  8. .net core 控制台下使用HttpClientFactory封装

    HttpClientFactory封装,如有错误请指出,谢谢! using System; using System.Collections.Generic; using System.Net.Htt ...

  9. .NET Core 2.0体验

    .NET Core 2.0预览版及.NET Standard 2.0 Preview 这个月也就要发布了. 具体相关信息可以查看之前的文章.NET Core 2.0及.NET Standard 2.0 ...

随机推荐

  1. java 线程间的通信 (wait / notify / notifyAll)

    package waitnotifytest; import java.util.Collections; import java.util.List; import com.google.commo ...

  2. 自建k8s集群日志采集到阿里云日志服务

    自建k8s集群 的master 节点安装 logtail 采集工具 wget http://logtail-release-cn-hangzhou.oss-cn-hangzhou.aliyuncs.c ...

  3. iOS CALayer 绘图模糊有锯齿的解决方案

    在CALayer中绘制图形会出现锯齿和模糊,同样绘图在UIView中就没有问题.经查资料发现不自动处理两倍像素的情况. 解决方案为:设置layer的contentsScale属性为[[UIScreen ...

  4. IOS应用内购(一)内购的种类

    Glossary IAP - In App Purchase, 应用内购. 内购种类 consumable - 可消费的,比如游戏中的金币,金币可以购买游戏道具或者装备,这个金币是可以消费的,用完之后 ...

  5. windows安装centos7子系统

    Windows的Linux子系统(wsl ) 自从有了wsl后,基本上虚拟机都省了,对于离不开Windows的便捷,Linux对开发的友好的人来说,真是一大利器.可惜默认的系统没有centos,幸运的 ...

  6. 【iCore4 双核心板_uC/OS-II】例程十一:内存管理

    一.实验说明: 应用程序在运行中为了某种特殊需要,经常需要临时获得一些内存空间.而作为比较完善的操作系统uC/OS-II,也具有动态分配内存的能力. uC/OS-II对内存进行两级管理:把连续内存分成 ...

  7. R语言:recommenderlab包的总结与应用案例

    R语言:recommenderlab包的总结与应用案例   1. 推荐系统:recommenderlab包整体思路 recommenderlab包提供了一个可以用评分数据和0-1数据来发展和测试推荐算 ...

  8. sql 视图 字段条件统计

    ) FModelCode,FProductTypeName,FBrandName,FOrganizationName,KOrganizationID,) FALLCount, end) SaleCou ...

  9. 什么是SPU、SKU、ARPU

    这是一篇存档性笔记,我自己存档一下对这3个词的理解.如果你已经明了了这3个词的意思,请直接忽略之 首先,搞清楚商品与单品的区别.例如,iphone是一个单品,但是在淘宝上当很多商家同时出售这个产品的时 ...

  10. Centos7.0下MySQL的安装

    1.下载mysql的repo源 $ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 2.安装mysql-comm ...