微信号:iDotNet

介绍:专注分享 .NET 相关技术文章、教程和工具.有时也会涉及到IT职场相关的一些东西,或者来点幽默趣文.

.NET Core 中正确使用 HttpClient 的姿势

2018-11-28 11:45 DotNet

(给DotNet加星标,提升.Net技能


转自:Liam Wang

cnblogs.com/willick/p/net-core-httpclient.html



一、直接使用方式


不管是哪种方式,都要先注册服务,对于 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);
   }
}



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);
   }
}



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部署中你不了解的框架依赖与独立部署

ASP.NET Core依赖注入和管道方式的异常处理及日志记录

ASP.NET Core Jenkins Docker 实现一键化部署


看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

 
DotNet 更多文章 .NET Core部署中你不了解的框架依赖与独立部署 ASP.NET Core依赖注入和管道方式的异常处理及日志记录 ASP.NET Core Jenkins Docker 实现一键化部署 .NET Core 使用AngleSharp爬取周公解梦数据 转行程序员?你可能忽略了一件事!
猜您喜欢 Android优化 好书来袭:谷歌首次披露SRE如何运行百万服务器 开源分布式分析引擎 - Hadoop Kylin On OLAP 艺术家王小慧:跨界是我们时代的创新源泉 奇舞周刊第 225 期:大前端的转变之路