.Net Core使用HttpClient请求Web API注意事项
程序员文章站
2022-05-04 23:33:12
使用HttpClient可以很方便的请求Web API,但在使用时有一些需要注意的地方,不然会给你的程序带来毁灭性的问题。HttpClient是一个继承了IDisposable接口的对象,所以在使用的时候,需要主动调用Dispose方法来释放它。 ......
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 State TCP 10.211.55.6:12050 47.74.132.243:http TIME_WAIT TCP 10.211.55.6:12051 47.74.132.243:http TIME_WAIT TCP 10.211.55.6:12053 47.74.132.243:http TIME_WAIT TCP 10.211.55.6:12054 47.74.132.243:http TIME_WAIT TCP 10.211.55.6:12055 47.74.132.243:http TIME_WAIT TCP 10.211.55.6:12056 47.74.132.243:http TIME_WAIT TCP 10.211.55.6:12057 47.74.132.243:http TIME_WAIT TCP 10.211.55.6:12058 47.74.132.243:http TIME_WAIT TCP 10.211.55.6:12059 47.74.132.243:http TIME_WAIT TCP 10.211.55.6:12060 47.74.132.243:http TIME_WAIT TCP 10.211.55.6:12061 47.74.132.243:http TIME_WAIT TCP 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
原文链接:
上一篇: 使用Python来开发Markdown脚本扩展的实例分享
下一篇: 爆逗,有了二货咱不缺笑
推荐阅读
-
或许是你应该了解的一些 ASP.NET Core Web API 使用小技巧
-
.net core使用HttpClient发送代理请求_程序内抓包_Fiddler抓包
-
或许是你应该了解的一些 ASP.NET Core Web API 使用小技巧
-
循序渐进学.Net Core Web Api开发系列【10】:使用日志
-
使用HTTP-REPL工具测试ASP.NET Core 2.2中的WEB API项目
-
.Net Core 3.0后台使用httpclient请求网络网页和图片_使用Core3.0做一个简单的代理服务器
-
ASP.NET Core Web API中使用Swagger
-
ASP.NET Core Web API 集成测试中使用 Bearer Token
-
.Net Core使用HttpClient请求Web API注意事项
-
使用 ASP.NET Core MVC 创建 Web API——响应数据的内容协商(七)