数码控科技猎奇Iphone动漫星座游戏电竞lolcosplay王者荣耀攻略allcnewsBLOGNEWSBLOGASKBLOGBLOGZSK全部技术问答问答技术问答it问答代码软件新闻开发博客电脑/网络手机/数码笔记本电脑互联网操作系统软件硬件编程开发360产品资源分享电脑知识文档中心IT全部全部分类全部分类技术牛文全部分类教程最新网页制作cms教程平面设计媒体动画操作系统网站运营网络安全服务器教程数据库工具网络安全软件教学vbscript正则表达式javascript批处理更多»编程更新教程更新游戏更新allitnewsJava新闻网络医疗信息化安全创业站长电商科技访谈域名会议专栏创业动态融资创投创业学院 / 产品经理创业公司人物访谈营销开发数据库服务器系统虚拟化云计算嵌入式移动开发作业作业1常见软件all电脑网络手机数码生活游戏体育运动明星影音休闲爱好文化艺术社会民生教育科学医疗健康金融管理情感社交地区其他电脑互联网软件硬件编程开发360相关产品手机平板其他电子产品摄影器材360硬件通讯智能设备购物时尚生活常识美容塑身服装服饰出行旅游交通汽车购房置业家居装修美食烹饪单机电脑游戏网页游戏电视游戏桌游棋牌游戏手机游戏小游戏掌机游戏客户端游戏集体游戏其他游戏体育赛事篮球足球其他运动球类运动赛车健身运动运动用品影视娱乐人物音乐动漫摄影摄像收藏宠物幽默搞笑起名花鸟鱼虫茶艺彩票星座占卜书画美术舞蹈小说图书器乐声乐小品相声戏剧戏曲手工艺品历史话题时事政治就业职场军事国防节日风俗法律法规宗教礼仪礼节自然灾害360维权社会人物升学入学人文社科外语资格考试公务员留学出国家庭教育学习方法语文物理生物工程学农业数学化学健康知识心理健康孕育早教内科外科妇产科儿科皮肤科五官科男科整形中医药品传染科其他疾病医院两性肿瘤科创业投资企业管理财务税务银行股票金融理财基金债券保险贸易商务文书国民经济爱情婚姻家庭烦恼北京上海重庆天津黑龙江吉林辽宁河北内蒙古山西陕西宁夏甘肃青海新疆西藏四川贵州云南河南湖北湖南山东江苏浙江安徽江西福建广东广西海南香港澳门台湾海外地区

排列组合技巧秒杀技巧:Asp.Net Core2.1前后使用HttpClient的两种方式

来源:脚本之家  责任编辑:小易  

河北20选五开奖结果 www.vhmyd.cn 前言

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

一、原先HttpClient使用方式

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

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

 return Ok(httpResponseMessage);
}

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

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

//do something...
using (var httpClient = new HttpClient())
{
 var requestUri = "//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的连接只要我们不通过代码把连接关闭,这个连接就会在客户端和服务端的进程中一直存在,相关状态数据会一直保存着,直到无响应状态持续了默认关闭时间后自动断开。

  

当短期请求量过大时,这就可能导致了"套接字资源耗尽异常",因此,为了解决这个问题,想到不释放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();

该方法内部实现过程可以浏览://www.vhmyd.cn/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("//aspnetcore.online/api/resource/getresource");
 return Ok(result);
 }
}

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

总结

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

您可能感兴趣的文章:


  • 本文相关:
  • c# httpclient cookie验证解决方法
  • 谈谈httpclient使用详解
  • asp.net mvc web api httpclient简介
  • 通过httpclient 调用asp.net web api示例
  • .net core中使用httpclient的正确姿势
  • .net core 2.1中httpclientfactory的最佳实践记录
  • asp.net core针对一个使用httpclient对象的类编写单元测试详解
  • .net core中httpclient的正确打开方式
  • .net之后台用户权限管理实现
  • 把asp.net mvc项目部署到本地iis上的完整步骤
  • asp.net百度ueditor编辑器实现上传图片添加水印效果
  • asp.net c#实现解压缩文件的方法
  • asp.net如何得到gridview中某行某列值的方法
  • asp.net列出数据库活跃链接的方法
  • 微信公众平台开发之获得accesstoken .net代码解析
  • redisrepository 分享和纠错
  • 解析微信支付的实现方法(.net版)
  • dotnet2.0 生成网站的测试
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 河北20选五开奖结果 - 频道导航
    Copyright © 2017 河北20选五开奖结果 www.vhmyd.cn All Rights Reserved
  • 在深入推动长江经济带发展座谈会上的讲话 2019-03-23
  • 把环保责任镶嵌到组织管理架构中去 2019-03-22
  • 今年江西千万元公益金买服务 受益者将更广泛 2019-03-22
  • 您访问的页面找不回来了 2019-03-22
  • 特金明日将通电话 提醒谁莫忘感恩? (原创首发) 2019-03-21
  • 法制日报:别让世界杯激情冲淡守法意识 2019-03-21
  • [大笑]小撸的眼睛在滴血…… 2019-03-21
  • 浙江大学科研团队潜心十五载 飞机装配有了国产自动化设备 2019-03-21
  • 不断开辟21世纪马克思主义新境界 —— 学习习近平总书记在纪念马克思诞辰200周年大会上的讲话 2019-03-20
  • 王一彪:为新时代“双一流”建设提供舆论支持 2019-03-20
  • 傅抱石《琵琶行诗意》1.035亿元成交 2019-03-19
  • 国地税怎么又合并了呢 一般来看 这是种集中资源的举动 2019-03-19
  • 中考期间 太原27个公共自行车服务点有人值守 2019-03-18
  • 美媒:美国“伪专家”太多,妨碍美对华关系 2019-03-18
  • “公路挤成步行街”端午假期超944万人次打卡“网红”重庆 2019-03-18
  • 46| 968| 520| 589| 78| 720| 252| 644| 574| 574|