• 推动长江经济带发展 习近平要求境界和担当 2019-11-11
  • 丰台东铁匠营街道:品粽赏乐感受改革开放四十周年 2019-11-11
  • 学习宣传宪法 弘扬法治精神 2019-11-07
  • 山东搭建“灯塔—党建在线”网络平台 2019-11-07
  • 2016杨宗纬VOCAL巡演北京站正式开票杨宗纬VOCAL 2019-11-04
  • 年龄大了,也想积点口德,已经给你笔下留情了。 2019-11-04
  • 人民网通行证——帮助 2019-11-03
  • 端午节,跟随习近平找寻中华民族“精气神” 2019-10-30
  • 天津加入抢人大战,你会否挑花眼? 2019-10-29
  • “海河英才”行动计划为企业解渴 2019-10-29
  • 在庆祝海南建省办经济特区30周年大会上的讲话 2019-10-07
  • 俄罗斯世界杯F组:球迷风采 2019-09-24
  • 彭于晏廖凡曝姜文“精神洁癖” 2019-09-24
  • 苏州大学研究生支教团网上众筹资助留守儿童 2019-09-23
  • 湖北政务微信排行榜第187期出炉 交警类公号表现亮眼 2019-09-19
  • 香港赛马会官立中学:Asp.Net Core2.1前后使用HttpClient的两种方式

     更新时间:2019年03月03日 14:27:18   作者:微笑刺客D   我要评论
    这篇文章主要给大家介绍了关于Asp.Net Core2.1前后HttpClient的使用方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    香港赛马会网站惠泽社绝杀八码 www.mwcrz.tw 前言

    在.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.mwcrz.tw/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使用一个句柄进行跟踪管理,当该实例使用完毕后,句柄仍然控制资源释放,在短期大量处理时,可以将这部分句柄完成对不同实例的跟踪管理,使得句柄,也就是相应的套接字生命周期延长,对套接字完成了复用。

    总结

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

    相关文章

    • 深入理解Asp.net中DataBinder.Eval的用法总结

      深入理解Asp.net中DataBinder.Eval的用法总结

      本篇文章是对Asp.net中DataBinder.Eval的用法进行了详细的分析介绍,需要的朋友参考下
      2013-06-06
    • asp.net 相关文章实现方法

      asp.net 相关文章实现方法

      大家或许会觉得很惊讶:为什么灵感之源会讨论SQL?或许应该这样说吧:搞业务系统,不跟SQL扯上关系似乎比较难。
      2009-05-05
    • 浅析DataBinder.Eval和Eval的区别

      浅析DataBinder.Eval和Eval的区别

      缩短的Eval语法与DataBinder.Eval的不同点在于,Eval会根据最近的容器对象(例如DataListItem)的DataItem属性来自动地解析字段,而DataBinder.Eval需要使用参数来指定容器
      2013-08-08
    • C# 获取当前星期几三种实现方法

      C# 获取当前星期几三种实现方法

      获取当前星期几实现这个功能有多种方法,接下来将列出3种供你参考,感兴趣的你可不要错过了哈,希望本文所提供的知识点对你有所帮助
      2013-02-02
    • DataGrid中实现超链接的3种方法

      DataGrid中实现超链接的3种方法

      这篇文章介绍了DataGrid中实现超链接的3种方法,有需要的朋友可以参考一下
      2013-09-09
    • ASP.NET Dictionary 的基本用法示例介绍

      ASP.NET Dictionary 的基本用法示例介绍

      ASP.NET中的Dictionary想必使用.net的朋友并不陌生吧,下面以示例的方式为大家介绍下其基本用法,感兴趣的朋友可以参考下
      2014-01-01
    • 深入浅析.NET应用程序SQL注入

      深入浅析.NET应用程序SQL注入

      这篇文章主要介绍了.NET应用程序SQL注入的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
      2016-09-09
    • 使用Lable控件输出九九乘法表

      使用Lable控件输出九九乘法表

      这篇文章主要为大家详细介绍了使用Lable控件输出九九乘法表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
      2017-11-11
    • .NET Core读取配置文件方式详细总结

      .NET Core读取配置文件方式详细总结

      这篇文章主要为大家详细总结了.NET Core读取配置文件方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
      2018-08-08
    • 探究ASP.NET Core Middleware实现方法

      探究ASP.NET Core Middleware实现方法

      这篇文章主要介绍了探究ASP.NET Core Middleware实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
      2019-02-02

    最新评论

  • 推动长江经济带发展 习近平要求境界和担当 2019-11-11
  • 丰台东铁匠营街道:品粽赏乐感受改革开放四十周年 2019-11-11
  • 学习宣传宪法 弘扬法治精神 2019-11-07
  • 山东搭建“灯塔—党建在线”网络平台 2019-11-07
  • 2016杨宗纬VOCAL巡演北京站正式开票杨宗纬VOCAL 2019-11-04
  • 年龄大了,也想积点口德,已经给你笔下留情了。 2019-11-04
  • 人民网通行证——帮助 2019-11-03
  • 端午节,跟随习近平找寻中华民族“精气神” 2019-10-30
  • 天津加入抢人大战,你会否挑花眼? 2019-10-29
  • “海河英才”行动计划为企业解渴 2019-10-29
  • 在庆祝海南建省办经济特区30周年大会上的讲话 2019-10-07
  • 俄罗斯世界杯F组:球迷风采 2019-09-24
  • 彭于晏廖凡曝姜文“精神洁癖” 2019-09-24
  • 苏州大学研究生支教团网上众筹资助留守儿童 2019-09-23
  • 湖北政务微信排行榜第187期出炉 交警类公号表现亮眼 2019-09-19
  • 足球手游 时时彩改欢乐生肖 下载御彩轩计划手机客户端 表情包发在哪能赚钱 澳门买大小怎么买赢面大 山西福彩快乐十分官方 好友二人斗地主 4399游戏盒下载手机版 有没有走路赚钱的一元提现到微信的 快三投注技巧视频