Lind.DDD.Utils.HttpHelper关于对HttpClient的正确使用

简介:

官方的不一定是对的,机器最能证明一切

不知道从什么时候起,我们在写数据库连接,网络连接,文件操作时会习惯加上using,这种习惯被我们误称为一种模式,但事实上,一切事情都有因有果的,使用using的作用是什么?我想这个问题大家都知道应该,它可以释放资源,而对于数据库连接来说,它不是释放数据连接,而只是把连接放里“连接池”,等待下次使用时,直接用池子里取出来即可,好处当然就是省去了很多“建立连接”时的开销,而不对网络连接来说,则不是那么简单了,不能一同而义,这点对于MSDN也有错误的说法和写法,最近在看博文时(老外的,Infoq上翻译的)给出了有利的证据,具体看下文。

using的写法其实就是对IDispose模块的实现 


  using (var http = new HttpClient(handler))
   {
    http.Timeout = new TimeSpan(0, 0, timeOut);
    HttpResponseMessage response;
    response = http.GetAsync(GeneratorUri(requestUri, ApiValidateHelper.GenerateCipherText(nv))).Result;
    return response;
   }

对于上面的代码,也是MSDN推荐的写法,即在使用完网络资源后,自动释放它,而对于下一次网络资源的访问,还需要从新去构建,事实上,从资源的销毁到下次资源的建立需要很大的代价,而且你的网络连接的构建(套接字)是有限制的,并不是无穷无近的,所以,我们必须要进行控制。

相关中文文章:http://www.infoq.com/cn/news/2016/09/HttpClient

相关英文文章:http://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/

下面是大叔对using方式进行的测试,可以通过截图看到,我们的TCP连接有很多,这样当高并发情况下,你的套接字连接将会被用斤。

可用套接字耗尽后可能出现这样的异常:System.Net.Sockets.SocketException!

改进后的程序(单例或者静态化的HttpClient)

   readonly static HttpClient http = new HttpClient(new HttpClientHandler()
        {
            AutomaticDecompression = System.Net.DecompressionMethods.GZip
        });
        [TestMethod]
        public void Get()
        {
            Stopwatch sw = new Stopwatch();
            sw.Restart();
            for (int i = 0; i < 1000; i++)
            {
                var response = http.GetAsync("http://www.sina.com").Result;
            }
            sw.Stop();
            Console.WriteLine("1000个请求的时间" + sw.ElapsedMilliseconds);
        }

修改之后,我们可以看到整个HttpClient的测试性能有了明显的提升!

对于控制台输出的TCP连接情况,我们也只看到一条相关的数据,这也是我们希望看到的!

netstat -nbp | findstr 202.108.33.107

结果

最后,感谢Infoq的编辑“谢丽”找了这么好的一篇文章,辛苦了!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:Lind.DDD.Utils.HttpHelper关于对HttpClient的正确使用,如需转载请自行联系原博主。

目录
相关文章
画椭圆ellipse
【6月更文挑战第30天】画椭圆ellipse。
113 2
|
存储 传感器 人工智能
探索现代数据中心的冷却技术革新
【5月更文挑战第18天】 在数字化时代,数据中心作为信息处理与存储的核心设施,其稳定性和效能至关重要。随着计算需求的激增,数据中心的冷却系统面临着前所未有的挑战。传统的空调冷却方法不仅耗能巨大,而且效率低下。本文将深入探讨现代数据中心冷却技术的最新进展,包括液冷技术、热管应用、环境辅助设计以及智能化管理等方面,旨在提供一种高效、可持续且经济的解决方案,以应对日益增长的冷却需求。
|
算法 程序员
【Leetcode】拿捏链表(三)——CM11 链表分割(牛客)、OR36 链表的回文结构(牛客)
【Leetcode】拿捏链表(三)——CM11 链表分割(牛客)、OR36 链表的回文结构(牛客)
156 0
【Leetcode】拿捏链表(三)——CM11 链表分割(牛客)、OR36 链表的回文结构(牛客)
|
JavaScript 前端开发 开发者
Vue + TypeScript + Element 项目实践(简洁时尚博客网站)及踩坑记(上)
Vue + TypeScript + Element 项目实践(简洁时尚博客网站)及踩坑记(上)
257 0
Vue + TypeScript + Element 项目实践(简洁时尚博客网站)及踩坑记(上)
|
弹性计算 UED 异构计算
弹性计算双周刊 第1期
阿里云弹性计算,3月新闻不断,看点最爆。2018年3月22日最新消息,ECS弹性计算在性能和可信安全等方面表现优异,代表阿里云获得工信部认可,获得奖项。2018年3月9日弹性裸金属服务器商业化正式发布。
7241 0
|
Web App开发 测试技术 Windows
一起谈.NET技术,部署Silverlight及Web Service
  一直通过vs测试Silverlight,本以为部署到服务器上是很简单的事。  没想到遇到了很多麻烦,用了整整一天的时间搜索解决方案。   先说部署到xp系统下本地IIS,服务器win2003也一样。
1068 0
|
C#
C# 如何合并Excel工作表
文档合并、拆分是实现文档管理的一种有效方式。在工作中,我们可能会遇到需要将多个文档合并的情况,那如何来实现呢,本文将进一步介绍。关于拆分Excel工作表,可参见这篇文章——C#如何拆分EXCEL工作表。
1524 0
|
机器学习/深度学习 Python
Python 数据科学手册 5.6 线性回归
5.6 线性回归 原文:In Depth: Linear Regression 译者:飞龙 协议:CC BY-NC-SA 4.0 译文没有得到原作者授权,不保证与原文的意思严格一致。
1119 0
|
1天前
|
云安全 人工智能 自然语言处理

热门文章

最新文章