相思资源网 Design By www.200059.com

前言

在.Net Core应用开发中,调用第三方接口也是常有的事情,HttpClient使用人数、使用频率算是最高的一种了,在.Net Core中,HttpClient的使用方式随着版本的升级也发生了一些变化,本次就讲解一下Asp.Net Core2.1前后使用的两种方式。

一、原先HttpClient使用方式

一般来讲,喜欢要用的时候才会选择去获取资源,因此,当在有需求时才会用HttpClient去调用资源,便会使用如下这种方式或其它方式获取资源。

//do something...
using (var httpClient = new HttpClient())
{
 var requestUri = "http://aspnetcore.online/api/resource/getresource";
 var httpResponseMessage = await httpClient.GetAsync(requestUri);
 //do something...

 return Ok(httpResponseMessage);
}

如果可以正常访问目标地址的话,则会返回相应的资源信息。  

Asp.Net Core2.1前后使用HttpClient的两种方式

又如Post方式提交并返回相应的内容,都是可以直接使用。

//do something...
using (var httpClient = new HttpClient())
{
 var requestUri = "http://aspnetcore.online/api/resource/postresource";
 var httpResponseMessage = await httpClient.PostAsJsonAsync(requestUri,"星城软件");
 //do something...

 return Ok(httpResponseMessage);
}

但是这种情况下会出现一个严重的问题,在不停的调用情形下,tcp连接数会被耗尽,虽然使用using方式调用HttpClient并在退出前调用Dispose()方法将HttpClient释放了,但是tcp连接仍然处于保持状态,在240s后才会自动断开,这里就涉及到一个连接状态了,首先得理解下http的工作原理,http协议是建立在tcp协议基础之上,当浏览器需要从服务器获取数据的时候,会发出一次http请求。http会通过tcp建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,http会立即将tcp连接断开,这个过程是很短的。所以http连接是一种短连接,是一种无状态的连接。但是tcp的连接只要我们不通过代码把连接关闭,这个连接就会在客户端和服务端的进程中一直存在,相关状态数据会一直保存着,直到无响应状态持续了默认关闭时间后自动断开。

Asp.Net Core2.1前后使用HttpClient的两种方式  

当短期请求量过大时,这就可能导致了"套接字资源耗尽异常",因此,为了解决这个问题,想到不释放HttpClient,将它作为单例一直使用,实现单例方式有很多种。

如使用单例模式,只生成一个HttpClient

private static HttpClient _httpClient = null;
public HttpClient CreateHttpClient()
{
 if (_httpClient == null) _httpClient = new HttpClient();
 return _httpClient;
}

 亦或是在初始化时完成单例注入,创建一个IHttpClient接口,及相应的实现StandardHttpClient,实现类种加入HttpClient属性,在实现类构造函数中完成初始化后便可直接使用该实现类完成资源请求工作。

//在startup中完成单例注入
services.AddSingleton<IHttpClient, StandardHttpClient>();

public interface IHttpClient
{
 //do something
}

public class StandardHttpClient : IHttpClient
{
 private HttpClient _client;

 public StandardHttpClient()
 {
 _client = new HttpClient();
 }

 //do something...
}

虽然这样解决了"套接字资源耗尽异常",但是又带来了新的问题,熬不过DNS生存时间(TTL),当主机 DNS 更新时,又可能产生异常,提示无法解析主机名称,因为单例HttpClient不会随着主机DNS更新而更新,Singleton HttpClient doesn't respect DNS changes。

An error occurred while sending the request. Couldn't resolve host name An error occurred while sending the request. Couldn't resolve host name 

二、现有HttpClient使用方式

在.Net Core2.1后,微软引入了HttpClientFactory彻底解决这个问题,工厂模式的职责是负责创建对象,这个类主要负责创建HttpClient实例

首先在StartUp中注册,可能会提示安装这个Nuget包

 services.AddHttpClient();

该方法内部实现过程可以浏览:https://www.jb51.net/article/157254.htm

其次,在需要使用时,使用构造函数注入即可

[Route("api/[controller]")]
[ApiController]
public class HttpClientController : ControllerBase
{
 IHttpClientFactory _httpClientFactory;

 public HttpClientController(IHttpClientFactory httpClientFactory)
 {
 _httpClientFactory = httpClientFactory;
 }

 [HttpGet]
 [Route(nameof(Index))]
 public async Task<IActionResult> Index()
 {
 var client = _httpClientFactory.CreateClient();
 var result = await client.GetAsync("http://aspnetcore.online/api/resource/getresource");
 return Ok(result);
 }
}

具体实现原理简述为:HttpClientFactory内部管理着一个连接句柄池,对每一个HttpClient使用一个句柄进行跟踪管理,当该实例使用完毕后,句柄仍然控制资源释放,在短期大量处理时,可以将这部分句柄完成对不同实例的跟踪管理,使得句柄,也就是相应的套接字生命周期延长,对套接字完成了复用。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

标签:
asp.net,core,httpclient使用,asp.net,core教程

相思资源网 Design By www.200059.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
相思资源网 Design By www.200059.com

评论“Asp.Net Core2.1前后使用HttpClient的两种方式”

暂无Asp.Net Core2.1前后使用HttpClient的两种方式的评论...

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。