博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net Core使用HttpClient请求Web API注意事项
阅读量:6923 次
发布时间:2019-06-27

本文共 2765 字,大约阅读时间需要 9 分钟。

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 connectionsOKOKOKOKOKOKOKOKOKOKConnections 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里面的方法都是线程安全的:

CancelPendingRequestsDeleteAsyncGetAsyncGetByteArrayAsyncGetStreamAsyncGetStringAsyncPostAsyncPutAsyncSendAsync

所以你应当只实例化一个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://afujl.baihongyu.com/

你可能感兴趣的文章
hibernateTemplate类的使用-总结
查看>>
PHP生成随机的HTML颜色代码
查看>>
python最简单的发邮件方式(不带附件)
查看>>
maven第二节-maven基础-依赖管理
查看>>
通过脚本加hosts.deny文件阻止防***
查看>>
javascript函数的3种定义方式
查看>>
ORA-12578: TNS:wallet open failed
查看>>
快收藏!高手Linux运维管理必备工具大全,你会吗?
查看>>
Linux下Redis服务安全加固
查看>>
我的友情链接
查看>>
Dockerfile构建简单的mysql
查看>>
nutch介绍和安装配置
查看>>
Linux下的tar压缩解压缩命令详解
查看>>
JDK环境变量配置
查看>>
AKKA入门
查看>>
如何使用KeyChain保存和获取UDID
查看>>
理解css中的长度单位
查看>>
折半算法的demo
查看>>
windows && linux 访问github
查看>>
【JavaScript】容器尺寸/偏移尺寸/滚动条距离
查看>>