博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HttpClient的巨坑
阅读量:5277 次
发布时间:2019-06-14

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

之前做项目的时候,调用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。

转载于:https://www.cnblogs.com/a14907/p/7839192.html

你可能感兴趣的文章
批量修改文件扩展名(批处理)
查看>>
Matlab求解线性方程组Ax=b的几种常见方法Matlab求解线性方程组Ax=b的几种常见方法...
查看>>
喜欢的电影
查看>>
会声会影毛玻璃制作
查看>>
HDU 2665 Kth number
查看>>
CodeChef DGCD Dynamic GCD
查看>>
记叙在人生路上对你影响最大的三位老师
查看>>
002.大数据第二天
查看>>
python装饰器
查看>>
树上的路径
查看>>
【转载】TCP好文
查看>>
系统平均负载
查看>>
【并发】实现内存可见的两种方法比较:加锁和volatile变量
查看>>
[线段树]/[水法] Jzoj P100036 随机
查看>>
问题总结
查看>>
jenkins升级为2.134
查看>>
软件随笔
查看>>
C/C++知识补充 (1)
查看>>
Fast Poisson Disk Sampling
查看>>
Python Cookbook(第3版)中文版:15.14 传递Unicode字符串给C函数库
查看>>