如何在。网络核心中使用HttpClient

  介绍

如何在。网络核心中使用HttpClient ?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

。净开发者都通过下面的方式发送http请求:

using  (var  httpClient =, new  HttpClient ())   {   ,var  response =, await  httpClient.GetAsync (uri);   ,,   ,//do  something  with 响应   }

这段代码理论上来说遵守了c#的最佳实践,HttpClient是IDisposable类型,所以我们通过用语法糖来使用HttpClient。微软官方的文档也提到:

作为一个规则,当你使用一个IDisposable对象,你应该宣布并实例化使用声明

可是,当我们试图运行下面的测试:

public  async  Task  SendRequest (),   {   ,Console.WriteLine (“Starting  reqeust");   ,(int 小姐:=,0;,i<10;,我+ +)   ,{   使用才能(var  client =, new  HttpClient ())   {才能   ,,var  result =, await  client.GetAsync (“http://www.baidu.com");   ,,Console.WriteLine (result.StatusCode);   ,,}   ,}   ,Console.WriteLine (“Reqeust  done");   }

此时在终端下列出所有端口:

netstat  -ap  tcp  |, grep 我;“time_wait"

如何在。网络核心中使用HttpClient

你会发现本地开启了10个端口,这说明HttpClient的工作原理其实跟我们认为的IDisposable是有区别的,如果你把HttpClient用作大规模的Http请求,实际上会创建很多个Http连接,而且这些资源并不能被立即释放。一个显而易见的改进方法是共享同一个HttpClient实例,从而达到节约插座资源的目的。

private  static  readonly  HttpClient  _client =, new  HttpClient ();   public  async  Task  SendRequest2 (),   {   ,_testOutputHelper.WriteLine (“Start  request");   ,   ,(int 小姐:=,0;,i<10;,我+ +)   ,{   var 才能;result =, await  _client.GetAsync (“http://www.baidu.com");   Console.WriteLine才能(result.StatusCode);   ,}   ,_testOutputHelper.WriteLine (“Request  done");   }

这个方案似乎解决了问题,使用单例的HttpClient的确会减少插座资源,但是这个方案会引发新的问题:由于这个Http连接始终保持连接状态,所以当请求地址的DNS发生更新的时候并不会应用到这个Http连接上。这个问题在微服务,高可用时代更加常见Singeton HttpClient并# 39;t尊重DNS变化。

最终,一个叫做HttpClientFactory的开源实现用来彻底解决这个问题。微软也将HttpClientFactory集成在了。网络核心中。

<强>在。网络核心中创建HttpClient
1。添加Nuget

Microsoft.Extensions.Http

2。在依赖注入容器中注册服务

services.AddHttpClient ();

3。使用构造器注入使用IhttpClientFactory

public  class  BasicUsage   {   ,private  readonly  IHttpClientFactory  _clientFactory;      ,public  BasicUsage (IHttpClientFactory  clientFactory)   ,{   时间=_clientFactory 才能;clientFactory;   ,}      ,public  async  Task  SendRequest ()   ,{   var 才能;request =, new  HttpRequestMessage (HttpMethod.Get,,   ,才能“http://www.baidu.com");      var 才能;client =, _clientFactory.CreateClient ();   var 才能;response =, await  client.SendAsync(请求);//才能do  something  for 响应   ,}   }

<>强4。使用名为HttpClient

由于我们在DI容器中注册了唯一的HttpClientFactory,意味着通过HttpClientFactory创建出来的HttpClient可能是同一个配置和参数,如果你需要不同配置的HttpClient,你可以通过“起名字的“的方式注册不同的HttpClient。

services.AddHttpClient (“baidu",, c =比;   {=,,c.BaseAddress  new  Uri (“https://www.baidu.com");   ,c.DefaultRequestHeaders.Add (“Accept",,“应用程序/json");   });

一旦注册了一个名叫“baidu"的HttpClient,你就可以通过下面的方式来建创建HttpClient:

var  client =, _clientFactory.CreateClient (“baidu");

如何在。网络核心中使用HttpClient