.Net Core使用HttpClient请求Web API注意事项

news/2025/2/12 18:04:04

HttpClient

使用HttpClient可以很方便的请求Web API,但在使用时有一些需要注意的地方,不然会给你的程序带来毁灭性的问题。

HttpClient是一个继承了IDisposable接口的对象,所以在使用的时候,需要主动调用Dispose方法来释放它。或者使用using:

using(var client = new HttpClient())
{//do something with http client
}

这看起来似乎没什么问题。我们使用一些代码来测试一下它,我们将发起10个GET请求:

namespace ConsoleApplication
{public class Program{public static async Task Main(string[] args) {Console.WriteLine("Starting connections");for(int i = 0; i<10; i++){using(var client = new HttpClient()){var result = await client.GetAsync("http://www.zkea.net");Console.WriteLine(result.StatusCode);}}Console.WriteLine("Connections done");}}
}

输出结果如下:

Starting connections
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
Connections done

看起来一切正常,但实际上并不是!我们使用netstat来查看一下sockets的使用情况:

C:\Users\wayne>NETSTAT.EXE
...Proto  Local Address          Foreign Address        StateTCP    10.211.55.6:12050      47.74.132.243:http  TIME_WAITTCP    10.211.55.6:12051      47.74.132.243:http  TIME_WAITTCP    10.211.55.6:12053      47.74.132.243:http  TIME_WAITTCP    10.211.55.6:12054      47.74.132.243:http  TIME_WAITTCP    10.211.55.6:12055      47.74.132.243:http  TIME_WAITTCP    10.211.55.6:12056      47.74.132.243:http  TIME_WAITTCP    10.211.55.6:12057      47.74.132.243:http  TIME_WAITTCP    10.211.55.6:12058      47.74.132.243:http  TIME_WAITTCP    10.211.55.6:12059      47.74.132.243:http  TIME_WAITTCP    10.211.55.6:12060      47.74.132.243:http  TIME_WAITTCP    10.211.55.6:12061      47.74.132.243:http  TIME_WAITTCP    10.211.55.6:12062      47.74.132.243:http  TIME_WAIT
...

虽然应用程序已经退出,但是刚才发起的连接仍处于 TIME_WAIT 状态。TIME_WAIT 状态是指连接已经在一边关闭,但仍在等待是否有其他数据包出现, 因为它们可能在网络上的某个地方被延迟,socket资源并没有立即被回收。所以,如果你的程序(网站)的并发量很大,而每一次都实例化一个HttpClient对象,你的程序将会消耗掉服务器上所有可用的socket资源,并导致程序出现异常,不可正常访问。

正确使用HttpClient

HttpClient里面的方法都是线程安全的:

CancelPendingRequests
DeleteAsync
GetAsync
GetByteArrayAsync
GetStreamAsync
GetStringAsync
PostAsync
PutAsync
SendAsync

所以你应当只实例化一个HttpClient对象,并且不需要去主动释放它,它会在你程序退出的时候一起被释放掉。

我们对程序做以下修改再测试一下:

namespace ConsoleApplication
{public class Program{private static HttpClient Client = new HttpClient();public static async Task Main(string[] args) {Console.WriteLine("Starting connections");for(int i = 0; i<10; i++){var result = await Client.GetAsync("http://aspnetmonsters.com");Console.WriteLine(result.StatusCode);}Console.WriteLine("Connections done");Console.ReadLine();}}
}

再看看socket使用情况,这下就一切正常了:

TCP    10.211.55.6:12254      47.74.132.243:http  ESTABLISHED

原文链接:http://www.zkea.net/codesnipp...


https://dhexx.cn/news/show-3822801.html

相关文章

企业IT机房中使用什么灭火器?

前言 根据可燃物的类型和燃烧特性,火灾分为A、B、C、D、E、F六类 (1)A类火灾:指固体物质火灾。这种物质通常具有有机物质性质,一般在燃烧时能产生灼热的余烬。如木材、煤、棉、毛、麻、纸张等火灾 (2)B类火灾:指液体或可熔化的固体物质火灾。如煤油、柴油、原油,甲醇…

et排版如何转换plt格式_如何最快速地转换电子书的格式?最全的格式转换网站集合!...

将如果你喜欢看电子书&#xff0c;那么电子书的文件格式就是你必须了解的。不同的电纸书、不同的阅读应用能打开和编辑的电子书格式是不同的&#xff0c;对于使用kindle 的小伙伴来说&#xff0c;EPUB 电子书就是无法使用的&#xff0c;而mobi、azw3 等格式就是显示效果最好的。…

会议室电视遥控器老是丢失如何彻底解决(解决方案)

环境&#xff1a; 联想E14 Win10专业版 问题描述&#xff1a; 会议室电视遥控器老是丢失如何彻底解决 解决方案&#xff1a; 1.采购&#xff0c;手机店的防盗连接器&#xff0c;防止遥控器乱拿乱放 2.到货实物 3.会议室安装完成 反面 电视机后面

网络安全-HttpOnlyCookies

未启用 HttpOnly&#xff0c;者就能更容易地访问用户 cookie&#xff0c;会造成XSS 在web.xml里加入这个启用即可<session-config><cookie-config><http-only>true</http-only></cookie-config> </session-config>转载于:https://blog.51c…

蓝牙设备改参数教程_传统蓝牙 BR/EDR 的搜索Inquiry

传统蓝牙BR/EDR的搜索Inquiry一提到蓝牙想必大家都会随口而出蓝牙音乐、蓝牙免提电话等等蓝牙技术提供的这些功能&#xff0c;这也是用户使用蓝牙的目的。但所有这些功能得以正常使用&#xff0c;有一个必要条件——蓝牙搜索。操作蓝牙的这些功能必须得知道对端蓝牙设备的存在&…

python的idle无法输入中文_Mac 下 Python 的 IDLE 无法输入中文

这个问题之前认为不必要就忽略了, 今天重新试了下.问题之前系统上用pyenv装的python 2.7.10, tk是mac默认版本, 有中文问题;解决问题依然存在;pyenv install 2.7.10 重装之后问题解决.原因这一节:How Python Chooses Which Tk Library To UseThe Tcl/Tk major version is deter…

企业机房建设方案

选址要求 1.电力供给应充足可靠,通信应快速畅通,交通应便捷; 2.采用水蒸发冷却方式制冷的数据中心机房,水源应充足。 3.自然环境应清洁,环境温度应有利于节约能源; 4.应远离产生粉尘、油烟、有害气体以及生产或贮存具有腐蚀性、易燃、易爆物品的场所 5.应远离水灾、地震等…

【重磅】AlphaZero炼成最强通用棋类AI,DeepMind强化学习算法8小时完爆人类棋类游戏...

2019独角兽企业重金招聘Python工程师标准>>> 世界最强围棋AI AlphaGo Zero带给世人的震撼并没有想象中那么久——不是因为大家都去看谁&#xff08;没&#xff09;跟谁吃饭了&#xff0c;而是DeepMind再次迅速超越了他们自己&#xff0c;超越了我们剩下所有人的想象…

python是一种机器语言类型的编程语言_新手无从下手?十大机器学习编程语言任你选...

近几年来各行业对机器学习专家的需求不断增长&#xff0c;人们对了解可用于机器学习的编程语言的兴趣也逐渐增加。GitHub是微软旗下的代码库&#xff0c;它发布了一个著名的用于机器学习的编程语言纲要。虽然Python一直保持着领先地位&#xff0c;但实用的构建机器学习算法的语…

H3C WX2510h无线控制器如何网关式部署无线网络

环境&#xff1a; H3C-WX2510H AC控制器 H3C Comware Software, Version 7.1.064, Release 5457 AP H3CWA6320-C 问题描述&#xff1a; H3C wx2510h无线控制器如何网关式部署无线网络 解决方案&#xff1a; 1.配置DHCP服务&#xff0c;开启vlan1为DHCP服务器 2.新建地址…