zoukankan      html  css  js  c++  java
  • 关于微软HttpClient使用,避免踩坑

    最近公司对于WebApi的场景使用也越来越加大了,随之而来就是Api的客户端工具我们使用哪个?我们最常用的估计就是HttpClient,在微软类库中命名空间地址:System.Net.Http,是一个支持异步编程的API的SDK框架;我在公司开发项目时,查阅了一些资料对这个Client如何使用的更合理,最大的保障就是承受高频繁的客户端发起连接和线程安全,接下来我就简要说说如何合理使用。

    一、普通场景使用(算是坑了)

    先看一下代码: 

    1             while (true)
    2             {
    3                 using (HttpClient client = new HttpClient())
    4                 {
    5                     var result = client.GetStringAsync("http://www.xxxxx.com").Result;
    6                     Console.WriteLine($"{result} > {DateTime.Now}");
    7                 }
    8             }

    以上代码请求必定在持续一段时间内会报错【大家在测试url地址时希望是内部局域网络】;

    有人会说这个是单线程估计没意思,我想说的是,如果你多线程里用using可能测试出来没问题,但想想线程的开启对CPU来说是一笔不小的开销,所有真正压倒api访问的频率其实不是特别高频率了;

    二、优化场景使用

    1             HttpClient client = new HttpClient();//这里的client可以用单例模式进行预先初始化
    2             while (true)
    3             {
    4                 var result = client.GetStringAsync("http://www.xxxx.com/").Result;
    5                 Console.WriteLine($"{result} > {DateTime.Now}");
    6             }

    而且由于里面的异步方法是线程安全的,所以不用担心多线程使用问题!

    2017.1.5

    注意了DeleteAsync在高并发情况会出现问题,大家谨慎使用

    三、关于DNS的BUG

    我觉得这个问题,不是不可以解决,如果用Nginx我觉得就能暂时解决这个换IP迁移等问题;

    在InfoQ上的对HttpClient的缺陷文章:http://www.infoq.com/cn/news/2016/09/HttpClient

    题外话:关于最佳单例模式的写法

            private static HttpClient client;
            public static HttpClient Singleton
            {
                get
                {
                    if (client == null)
                    {
                        Interlocked.CompareExchange(ref client,new HttpClient(),null);
                    }
                    return client;
                }
            }

    后续:近期我们公司技术同事对using和单例模式,进行不同的压测,最后得出结论是HttpClient在同步模式下使用生产环境是相对性能没有异步好,故项目有必要进行.NET FRAMEWORK提升到4.5以上,这样会有更好性能 > 2017.1.11

  • 相关阅读:
    Html5 Input 类型
    Html5 部分特性
    Asp.net Mvc4 基于Authorize实现的模块访问权限
    第11天知识点总结
    C# string类型和byte[]类型相互转换
    C#中AppDomain.CurrentDomain.BaseDirectory及各种路径获取方法
    Socket 学习
    C#中的Dictionary字典类介绍
    js判断客户端是pc还是手机
    input type="file" accept="image/*"上传文件慢的问题解决办法
  • 原文地址:https://www.cnblogs.com/rjf1979/p/6233971.html
Copyright © 2011-2022 走看看