为了更方便在服务端调用 HTTP 请求,微软在 .NET Framework 4.x 的时候引入了 HttpClient。但 HttpClient 有很多严重问题,一直饱受诟病,比如 InfoQ 的这篇文章 t.cn/Evzy80y,吐槽了 HttpClient 不能立即关闭连接、性能消耗严重等的问题。

.NET Core 2.1 开始引入的 HttpClientFactory 解决了 HttpClient 的所有痛点。有了 HttpClientFactory,我们不需要关心如何创建 HttpClient,又如何释放它。通过它可以创建具有特定业务的 HttpClient,而且可以很友好的和 DI 容器结合使用,更为灵活。下面以 http://ASP.NET Core 为例介绍 HttpClient 新的三种正确使用方式。

一、直接使用方式

不管是哪种方式,都要先注册服务,对于 http://ASP.NET Core 应用则是在 Startup.cs 文件的 ConfigureServices 添加如果代码:

services.AddHttpClient();

然后在 Controller 中通过构造注入的试获得 IHttpClientFactory,然后通过它来创建 HttpClient 对象。示例代码:

public class ValuesController : BaseController
{private readonly IHttpClientFactory _httpClientFactory;public ValuesController(IHttpClientFactory httpClientFactory){_httpClientFactory = httpClientFactory;}[HttpGet]public async Task<ActionResult> Get(){var client = _httpClientFactory.CreateClient();client.BaseAddress = new Uri("http://api.github.com");string result = await client.GetStringAsync("/");return Ok(result);}
}

这种使用方式适合一次性的 HTTP 请求调用,弊端是如果多次都要请求 github 的接口,那就得写很多重复代码配置 HttpClient。

二、命名式使用方式

命名式的使用方式可以解决第一种方式的问题,对于特定域名的 HTTP 调用,可以只做一次配置,然后在多个地方通过名称拿到相同的 Client 来使用。

首先在 Startup.cs 注册服务的地方添加带有特定名称的 HttpClient 服务,并添加需要的配置,如下示例:

services.AddHttpClient();
services.AddHttpClient("github", c =>
{c.BaseAddress = new Uri("https://api.github.com/");c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
});

注意这里添加了两次 AddHttpClient,一次是没有命名的,一次是有命名的。在 Controller 中的使用方式是:

public class ValuesController : BaseController
{private readonly IHttpClientFactory _httpClientFactory;public ValuesController(IHttpClientFactory httpClientFactory){_httpClientFactory = httpClientFactory;}[HttpGet]public async Task<ActionResult> Get(){var client = _httpClientFactory.CreateClient("github");string result = await client.GetStringAsync("/");return Ok(result);}
}

但如果使用很频繁,这种获取 Client 的方式还是有一点麻烦。下面介绍第三种方式,可以在使用的时候方便一点,但配置要麻烦些。

三、类型化使用方式

类型化的使用方式可以预先把配置放到自定义的 HttpClient 中,然后在需要的地方都过依赖注入直接拿到 HttpClient 实例。

我们来看具体的例子,首先自定义一个 HttClient 类,比如访问 github 接口的类可以这样定义:

public class GitHubClient
{public HttpClient Client { get; private set; }public GitHubClient(HttpClient httpClient){httpClient.BaseAddress = new Uri("https://api.github.com/");httpClient.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");httpClient.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");Client = httpClient;}public async Task<string> GetData(){return await _client.GetStringAsync("/");}
}

这里的 GetData 就是额外扩展的共用方法。使用前需要为这个类注册服务:

services.AddHttpClient<GitHubClient>();

然后在需要的地方(比如 Controller)中这样使用:

public class ValuesController : BaseController
{private readonly GitHubClient _gitHubClient;;public ValuesController(GitHubClient gitHubClient){_gitHubClient = gitHubClient;}[HttpGet]public async Task<ActionResult> Get(){string result = await _gitHubClient.GetData();return Ok(result);}
}

类型化的方式和命名式的方式相比,虽然在配置的时候会麻烦一点,但它有两个好处:一是不用通过名称字符串来获得 Client,而是直接通过依赖注入获得具体的 Client;二是可以在自定义的 HttpClient 类中扩展共用的方法。

.net core不能使用httpget_.NET Core 中正确使用 HttpClient 的姿势相关推荐

  1. .NET SDK-Style 项目(Core、Standard、.NET5)中的版本号

    .NET SDK-Style 项目(Core.Standard..NET5)中的版本号 独立观察员 2020 年 12 月 24 日 之前 .NET Framework 时,项目版本号等信息是存储在  ...

  2. Entity Framework Core生成的存储过程在MySQL中需要进行处理及PMC中的常用命令

    在使用Entity Framework Core生成MySQL数据库脚本,对于生成的存储过程,在执行的过程中出现错误,需要在存储过程前面添加 delimiter // 附:可以使用Visual Stu ...

  3. 《从零开始学ASP.NET CORE MVC》:ASP.NET Core 中的 Main方法(5)

    本文出自<从零开始学ASP.NET CORE MVC> 推荐文章:ASP.NET Core Web 项目文件 ASP.NET Core 中的 Main方法 一个开始专心写字的人 在ASP. ...

  4. 什么是core dump linux下用core和gdb查询出现段错误的地方

    什么是core dump   linux下用core和gdb查询出现"段错误"的地方 http://blog.chinaunix.net/uid-26833883-id-31932 ...

  5. ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程

    ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单 ...

  6. linux下产生core文件以及不产生core文件的条件

    原文:http://team.eyou.com/?p=27 Linux下,产生core文件,和不产生core文件的条件: 当我们的程序崩溃时,内核有可能把该程序当前内存映射到core文件里,方便程序员 ...

  7. ASP.NET Core 基础教程 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 基础教程 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 是对 ASP.NET 有重大意义的一次重新设计.本章节我们将介绍 A ...

  8. ASP.NET Core 实战:将 .NET Core 2.0 项目升级到 .NET Core 2.1

    一.前言  最近一两个星期,加班,然后回去后弄自己的博客,把自己的电脑从 Windows 10 改到 Ubuntu 18.10 又弄回 Windows 10,原本计划的学习 Vue 中生命周期的相关知 ...

  9. ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First

    ASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库. Entity Frame ...

最新文章

  1. 结对编程--------四则运算 实验总结2
  2. Win10双系统CentOS7安装完无法启动Win10的解决方法
  3. 如何居中一个元素(终结版)
  4. 那传说中的P、NP以及NPC问题
  5. 【Python-3.5】matplotlib绘制气温折线图
  6. Mac上创建cocos2d-x工程
  7. vue 检测ie版本_vue 兼容低版本ie浏览器
  8. 实验一 MATLAB数字图像处理基本操作
  9. 安卓flash插件_谷歌Chrome 76稳定版正式发布:默认禁用Flash
  10. 人工智能数学基础---定积分2:定积分的性质
  11. DSPF28335学习笔记之(1)CMD文件说明
  12. V-rep机器人仿真软件使用的学习笔记-续
  13. 北航单片机李广弟c语言还是汇编,单片机基础备课笔记
  14. axios 注册拦截器 cdn引用_提高传输速度,选p2p加速还是cdn加速呢?
  15. pthread_cont_wait和pthread_cont_signal
  16. python对象的生命周期_python对象的生命周期
  17. 【源码分享】ASP.NET企业办公综合管理系统源码(OA+CRM+进销存+财务)
  18. No.172-HackTheBox-Linux-Scavenger-Walkthrough渗透学习
  19. 分布式、集群概念汇总(二)
  20. 【luogu P4899】werewolf 狼人(最小生成树)(主席树)

热门文章

  1. 为什么explorer.exe会占有大量的CPU?
  2. showModalDialog 使用详解
  3. Android开发人员应该知道的一些技术
  4. F - 你这是第一次让我看到落泪了呢 POJ - 3661Running 区间DP
  5. Android--使用剪切板在Activity中传值
  6. Basic Calculator II
  7. 关于高性能网络编程的一些知识
  8. struts2和struts1认识
  9. 【翻译】Go 1.1 交叉编译
  10. 算法题008 快速找出故障机器