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的编辑“谢丽”找了这么好的一篇文章,辛苦了!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2013-09-12 知方可补不足~SQL中的count命令的一些优化措施(百万以上数据明显)
2012-09-12 Orchard中的Content Type,Content Parts和Content Items究竟是啥?