.Net Core使用HttpClient请求Web API注意事项
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
相关推荐
wangqd 2020-11-09
liupengqwert 2020-10-28
一叶梧桐 2020-10-14
lzzyok 2020-10-10
88550291 2020-08-21
yang0cs 2020-07-04
MichelinMessi 2020-06-13
fengshantao 2020-06-11
安得情怀似旧时 2020-06-11
llxxyy0 2020-06-05
houjinkai 2020-06-03
Dukezhao 2020-05-29
yshlovelx 2020-05-27
dancheng 2020-05-26
songjie 2020-02-14
TMD咯MySQL 2020-05-09
简单的快乐 2020-05-09
爱传文档 2020-05-04