如何在。网络核心中使用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"
你会发现本地开启了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.Http2。在依赖注入容器中注册服务
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