ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,这篇文章我们将会讨论如何在 ASP.Net Core 中使用 HttpClientFactory。

为什么要使用 HttpClientFactory

可以用 HttpClientFactory 来集中化管理 HttpClient,工厂提供了对 HttpClient 的创建,配置和调度,值得一提的是:HttpClient 一直都是 Http 请求业务方面的一等公民。

HttpClient 虽好,但它有一些缺点:

  • 创建太多的 HttpClient 是一种低效的行为,因为当一个新客户端连接到远程 Server 时,你的应用程序还需要承担着重连远程 Server 的开销。

  • 如果每一个 request 都创建一个 HttpClient,当应用程序负载过大, Socket 必将耗尽,比如默认情况下 HttpClient 会维持至少4分钟的 Connection 连接。

所以推荐的做法是创建一个可供复用的共享式 HttpClient 实例,如果你要打破沙锅问到低的话,即使是创建共享式的 HttpClient 也会有很多问题,比如它会无视 DNS 缓存生效,那怎么办呢?可以用 .NET Core 2.1 引入的 HttpClientFactory 来解决此问题。。。用它来统一化的高效管理 HttpClient。

使用 HttpClientFactory

HttpClientFactory 有两种使用方式。

  • NamedClient

  • TypedClient

所谓的 NamedClient 就是注册带有标记的 HttpClient 到 HttpClientFactory 工厂中,下面的代码展示了一个名为 IDGCustomApi 的 HttpClient 的工厂注册。

// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){services.AddHttpClient("IDGCustomApi", client =>{client.BaseAddress = new Uri("https://localhost:6045/");client.DefaultRequestHeaders.Add("Accept", "application/json");client.DefaultRequestHeaders.Add("User-Agent", "IDG");});services.AddControllers();}

所谓的 TypedClient 就是注册一个你自定义的 HttpClient,我想你肯定有点懵逼了,没关系,我现在就来自定义 HttpClient, 然后通过 AddHttpClient() 注册到容器中。

public class CustomHttpClient{public HttpClient Client { get; }public CustomHttpClient(HttpClient client){Client = client;}}public class Startup{// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){services.AddHttpClient<CustomHttpClient>(client => client.BaseAddress = new Uri("https://localhost:6045/"));services.AddControllers();}}

注入 Controller

为了能够在 Controller 中使用,可以将 IHttpClientFactory 通过构造函数方式进行注入,参考如下代码:

[ApiController][Route("[controller]")]public class WeatherForecastController : ControllerBase{private IHttpClientFactory httpClientFactory;public WeatherForecastController(ILogger<WeatherForecastController> logger, IHttpClientFactory httpClientFactory){this.httpClientFactory = httpClientFactory;}[HttpGet]public async Task<string> Get(){var httpClient = httpClientFactory.CreateClient("IDGCustomApi");string html = await httpClient.GetStringAsync("http://bing.com");return html;}}

从 IHttpClientFactory 的默认实现 DefaultHttpClientFactory 的源码也可以看出,httpClient 所关联的 HttpMessageHandler 和 Options 都被工厂跟踪和管控。

internal class DefaultHttpClientFactory : IHttpClientFactory, IHttpMessageHandlerFactory{public HttpClient CreateClient(string name){if (name == null){throw new ArgumentNullException("name");}HttpMessageHandler handler = CreateHandler(name);HttpClient httpClient = new HttpClient(handler, disposeHandler: false);HttpClientFactoryOptions httpClientFactoryOptions = _optionsMonitor.Get(name);for (int i = 0; i < httpClientFactoryOptions.HttpClientActions.Count; i++){httpClientFactoryOptions.HttpClientActions[i](httpClient);}return httpClient;}public HttpMessageHandler CreateHandler(string name){if (name == null){throw new ArgumentNullException("name");}ActiveHandlerTrackingEntry value = _activeHandlers.GetOrAdd(name, _entryFactory).Value;StartHandlerEntryTimer(value);return value.Handler;}}

译文链接:https://www.infoworld.com/article/3276007/how-to-work-with-httpclientfactory-in-aspnet-core.html

如何在 ASP.NET Core 中使用 HttpClientFactory ?相关推荐

  1. 如何在 ASP.Net Core 中使用 Autofac

    依赖注入可以有效的实现对象之间的 松耦合 并能够实现代码的可测试和可维护性,ASP.Net Core 提供了一个极简版的容器实现对 依赖注入 的原生支持,然而内置的依赖注入容器相比成熟的 依赖注入容器 ...

  2. 如何在 ASP.Net Core 中使用 Lamar

    ASP.Net Core 自带了一个极简的 开箱即用 的依赖注入容器,实际上,你还可以使用第三方的 依赖注入容器 来替代它,依赖注入是一种设计模式,它能够有效的实现对象之间的解耦并有利于提高单元测试和 ...

  3. 如何在 ASP.Net Core 中使用 MediatR

    MediatR 是一个 中介者模式 的.NET开源实现, 中介者模式 管控了一组对象之间的相互通讯并有效的减少了对象之间错综复杂的相互依赖,在 中介者模式 中,一个对象不需要直接和另一个对象进行通讯, ...

  4. 如何在 ASP.Net Core 中对接 WCF

    在 REST API 出现之前,SOAP (Simple Object Access Protocol) 一直都是基于 web 的标准协议,虽然现在 REST 大行其道,但在平时开发中总会遇到对接第三 ...

  5. 如何在 ASP.Net Core 中使用 NCache

    虽然 ASP.Net Core 中缺少 Cache 对象,但它引入了三种不同的cache方式. 内存缓存 分布式缓存 Response缓存 Alachisoft 公司提供了一个开源项目 NCache, ...

  6. 如何在 ASP.Net Core 中使用 Configuration Provider

    ASP.NET Core 是一个开源的,跨平台的,精简的模块化框架,可用于构建高性能,可扩展的web应用程序, ASP.NET Core 中的数据配置常用 k-v 的形式存储,值得注意的是,新的数据配 ...

  7. 如何在 ASP.Net Core 中使用 Serilog

    记录日志的一个作用就是方便对应用程序进行跟踪和排错调查,在实际应用上都是引入 日志框架,但如果你的 日志文件 包含非结构化的数据,那么查询起来将是一个噩梦,所以需要在记录日志的时候采用结构化方式. 将 ...

  8. 如何在 ASP.NET Core 中使用 URL Rewriting 中间件

    URL rewriting 是根据预先配置好的一组规则去修改 request url,值得注意的是:URL Rewriting 的重写功能和 url 重定向 是两个概念,本篇我们就来讨论下如何在 AS ...

  9. 如何在 ASP.NET Core 中使用 Quartz.NET 执行任务调度

    当我们在web开发中,常常会遇到这么一个需求,在后台执行某一项具体的任务,具体的说就是这些任务必须在后台定时执行. Quartz.NET 是一个开源的 JAVA 移植版,它有着悠久的历史并且提供了强大 ...

最新文章

  1. openstack(Queens) neutron-l3-agent 代码解析1(从命令行启动到同步plugin数据)
  2. [原创] MAME架构、编译及配置浅析
  3. 【NLP】PET——文本分类的又一种妙解
  4. 【LeetCode】深搜DFS(共85题)
  5. shell脚本中常见的几个判断
  6. 二级公共基础知识_计算机系统习题,二级公共基础知识新增章节
  7. 网络丢包诊断与分析的现实与理想
  8. 【转载】白话经典算法系列之六 快速排序 快速搞定
  9. chrome浏览器版本简单介绍
  10. Nginx源码安装,配置开机自启
  11. 计算机技能比赛试题,计算机技能竞赛比赛试题文字录入WORDEXCEL
  12. 关于如何关闭Windows错误报告
  13. 华为光猫上线流程、注册失败、常见语音故障处理
  14. 英语学术论文简短语句摘抄
  15. Java获取国家节假日规定休息日期
  16. 第三方接入-飞猪酒店商品发布流程
  17. 肮脏的城市与下水道的历史
  18. Kafka_producer
  19. 虚拟信用卡最大的发行商有哪些?
  20. 数据科学与大数据技术和大数据管理与应用哪个好

热门文章

  1. python 切片_全面解读Python高级特性切片
  2. Linux MySQL 5.1.62 source install
  3. Android-一张图理解MVP的用法
  4. BZOJ 1047: [HAOI2007]理想的正方形 单调队列瞎搞
  5. 特殊的求和(函数和循环)
  6. [BZOJ4182]Shopping
  7. C++中的namespace ----转载
  8. jquery weui 中alert弹出框在ios中跳动问题
  9. Shell 学习笔记之运算符
  10. 掌握jQuery插件开发