zoukankan      html  css  js  c++  java
  • HttpClient的巨坑

    之前做项目的时候,调用api都是使用的HttpWebRequest
    最近一个项目改用HttpClient,用了之后,感觉很坑。

    1.高并发情况下,造成tcp连接占用的端口无法释放(时间为2MSL,此时tcp连接状态为TIME_WAIT)

    造成这个的原因是,代码中HttpClient的实例,都是new了之后就dispose,用tcpview工具查看,会看到大量的TIME_WAIT状态的连接,不能及时释放,假设短时间内大量请求进来,那么很有可能,有大量的链接处于等待状态,极端点,造成服务器全部的端口都被占用,这个时候再有连接进来,将会造成失败!这也是之前我一直遇到的问题,压测的时候有大量的错误,日志显示是因为无法连接api。

    2.网上对于上面的情况有一种说法是可以把一个HttpClient实例,做成静态的,全部线程都是用这个实例,并且表示里面的大部分方法都是线程安全。

    好吧!好像的确是可以,但是在这里我遇到的问题是,我在使用这个httpClient的时候,需要动态设置请求头内容。使用静态的对象,很容易就遇到一个问题:集合已修改;可能无法执行枚举操作
    这里的集合就是请求头的集合。
    这个问题可以用HttpClient的SendAsyncz这个方法,参数是HttpRequestMessage,你可以把这个请求头设置到那上面去
    HttpClient的DefaultHttpHeader,HttpContent的Headers,HttpRequestMessage的Headers,三个地方都可以设置请求头

    其实到了这个地步我已经觉得HttpClient,和我现在这个项目基本就没啥缘分了。最后的结果是用回HttpWebRequest。

  • 相关阅读:
    start tag, end tag issues in IE7, particularly in xslt transformation
    用SandCastle为注释生成chm文档
    Firebug
    架构的重点
    Linux Shell常用技巧(十) 管道组合
    Linux JDK升级
    Linux Shell常用技巧(十二) Shell编程
    Packet Tracer 5.0实验(一) 交换机的基本配置与管理
    Linux Shell常用技巧(六) sort uniq tar split
    Linux Shell常用技巧(二) grep
  • 原文地址:https://www.cnblogs.com/a14907/p/7839192.html
Copyright © 2011-2022 走看看