zoukankan      html  css  js  c++  java
  • .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:Userswayne>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
    

      

    原文链接:http://www.zkea.net/codesnippet/detail/post-122.html

  • 相关阅读:
    冒泡排序算法
    delphi 处理图片(剪切,压缩)
    delphi 创建DLL文件 及其调用和注意事项
    对属性的认识
    timer实现Grid自动换行(连续相同的id跳到下一行)
    Form1调用Unit2类中函数
    微信二次分享不显示摘要和图片
    location.search为空导致微信拿不到code的问题
    考虑一下微信跳转的登录流程如何修改-无感知
    微信7.0(2019年1月份之后,没法使用抓包了,也许是为了安全,所以联调出问题记得看后台日志)
  • 原文地址:https://www.cnblogs.com/seriawei/p/9328998.html
Copyright © 2011-2022 走看看