用技巧] Http请求偶尔超时+总结各种超时死掉的可能和相应的解决办法
最近在做一个从某方获取数据的接口,在本地调试通的过程中也算顺利,可是布置到服务器上,超时非常频繁,一度怀疑是不是服务器网络有问题,阿里云的应该不至于呀,于似乎找到接口对接人员,询问有没有什么特殊的设置,后来实在也找不出什么原因,就抱着试一试的态度,度娘一下,碰到这种问题的还不少,超时超时超时如何解决,不一定全行 但是我使用过后 目前不在超时,方案如下:
对于GetResponse或GetRequestStream超时死掉的原因,可能是:
1.DefaultConnectionLimit是默认的2,而当前的Http的connection用完了,导致后续的GetResponse或GetRequestStream超时死掉
==>>
默认系统只支持同时存在2个http的connection
==>>
使用HttpWebRequest之后如果没有close,则会占用1个http的connection,所以如果超过2次使用
HttpWebRequest而没有close,那么就用完系统的http的connection,之后再去使用
HttpWebRequest,GetResponse就会死掉
解决办法:
办法1:
每次使用完HttpWebRequest,使用
1 2 |
req.Close(); req=null; |
去关闭对应的http connection
最好对应的HttpWebResponse也要close:
1 2 |
resp.Close(); resp =null; |
方法2:
修改DefaultConnectionLimit的值,改为足够大,比如:
1 |
System.Net.ServicePointManager.DefaultConnectionLimit = 200; |
2.系统中Http相关的资源没有正确释放,导致后续GetResponse或GetRequestStream超时死掉
就像我此处遇到的,可能是之前调用http相关函数,没有正确完全释放资源,导致虽然DefaultConnectionLimit给了足够大,但是还是
会死掉,此时在http请求代码之前去做一次垃圾回收,则后续http的GetResponse或GetRequestStream就正常了,就不会超时
死掉了。
参考代码如下:
1 2 3 4 5 |
System.GC.Collect(); req = (HttpWebRequest)WebRequest.Create(constSkydriveUrl); setCommonHttpReqPara(ref req); resp = (HttpWebResponse)req.GetResponse(); |
3.Http的GET请求时,不要手动设置ContentLength的值
即Http的GET请求,不要添加类似如下的代码:
1 2 |
if(m_contentLength > 0) httpWebRequest.ContentLength = m_contentLength; |
不要去手动修改对应的ContentLength的值,C#的http相关库函数,会自动帮你计算的。
注:POST方法中,的确是要手动填充数据和算出数据大小,然后手动给ContentLength赋值的。
4.其他可能的一些原因
(1)关于KeepAlive的问题
如果Http的请求,是设置了KeepAlive=true的话,那么对应的http的connection会和服务器保持连接的。
所以如果上述办法都不能解决超时的问题,可以尝试将keepAlive设置为false试试,看看能否解决。
(2)关于Sleep
有些人好像是通过在http请求前,加了对应的Sleep,结果解决了此问题。需要的人,也可以试试。
(3)HttpWebRequest的Timeout
一般来说,既然超时了,往往是由于错误使用函数或者网络有问题导致的,所以实际上此处对于有些人去把HttpWebRequest的Timeout的值改的更大,往往都是没用的。
只不过,万一是由于网络响应慢而导致超时,那么倒是可以尝试,将HttpWebRequest的Timeout的值改为更大。
(其中HttpWebRequest的Timeout默认的值是100,000 milliseconds ==100
seconds)
参考代码:
1 |
req.Timeout = 5 * 60 * 1000;// 5 minutes |
转载的地址http://www.sufeinet.com/thread-11652-1-1.html 多谢楼主
后来在翻翻自己的博客 原来好早之前自己已经用这个方法解决过 唉 太久没有用这东西 就容易忘记。
用技巧] Http请求偶尔超时+总结各种超时死掉的可能和相应的解决办法相关推荐
- C# Http请求偶尔超时+总结各种超时死掉的可能和相应的解决办法
[问题] 用C#模拟网页登陆,其中去请求几个页面,会发起对应的http的请求request,其中keepAlive设置为true,提交请求后,然后会有对应的response: resp = (Http ...
- afn访问本地html,请求接口AFN报错1016,failed:unacceptablecontent-type:text/html解决办法...
通常导致这种情况,是因为你和后台请求或者返回参数返回格式不一致导致.比如,后台要求你请求的头和请求体格式都为Json格式,但是后台返回给你的header格式为text/html格式. 返回错误信息如图 ...
- Spring拦截器获取request请求体中的json数据,并转换成Java对象的解决办法
1.要被拦截的Controller接口 我们需要一个更新用户信息接口,请求方式为POST,参数类型为对象类型(UserInfo),代码如下: @Resource private UserService ...
- python2.7web代码用python3.6运行时,浏览器发送请求报错TypeError: Object of type 'bytes' is not JSON serializable的解决办法
浏览器的Cookie由Python 2代码设置.Python 3将cookie内容解释为字节字符串.只要清除浏览器cookie就好了.
- HTTP请求偶尔失败(21秒后超时) - 问题排查
目录 背景 架构及请求模式 专线网络变更 排查分析 问题1:请求后,立刻就会响应,但无reponse 问题2:请求后,21秒后打印日志,但无reponse 问题3:主机不可达(No route to ...
- c# http请求执行超时,解决办法(给某个方法设定超时时间)
c# http请求执行超时,解决办法(给某个方法设定超时时间) 参考文章: (1)c# http请求执行超时,解决办法(给某个方法设定超时时间) (2)https://www.cnblogs.com/ ...
- nginx post请求超时_Nginx 的超时 timeout 配置详解
本文介绍 Nginx 的 超时(timeout)配置.分享给大家,具体如下: Nginx 处理的每个请求均有相应的超时设置.如果做好这些超时时间的限定,判定超时后资源被释放,用来处理其他的请求,以此提 ...
- Ajax请求session超时解决办法
Ajax请求session超时解决办法 问题描述 通过ajax发送请求,被后台过滤器或者拦截器拦截的时候,如果session超时,不会直接跳转到登录页面. 解决方案 在过滤器或者拦截器中设置respo ...
- <转载>主机ping虚拟机ip请求超时解决办法
虚拟机ping主机可以通,但主机ping虚拟机就请求超时 解决办法 打开电脑的设置,找到网络 VMware Network Adapter VMnet1和 VMware Network Adapter ...
最新文章
- filter,map,reduce,apply函数
- Nginx源码分析-内存池
- Android Cursor类的概念和用法
- 监控最佳实践--redis及业务接口
- python 下载图片到内存卡_python - 获取图像大小而不将图像加载到内存中
- 编程语言分类 -- 强类型与弱类型、动态类型与静态类型
- wps怎么投递简历发到boss直聘_BOSS直聘角逐招聘季:装机量、下载增量、增长率三料冠军...
- 南方周末:阿里巴巴的大数据梦
- 读贾志鹏线性筛有感 (莫比乌斯函数的应用)
- net执行oracle的存储过程
- vue-style,vue-style-scoped
- SQL Server Storage
- 12864与24C04的原理和使用方法——以电子密码锁为例(上篇)
- SAP中物料质检视图中检验设置和QM采购的应用区别
- 矩阵特征值的求解例子
- 【NOIP2015】洛谷2668 斗地主
- Material Design 之Style(三)
- 微信扫码---进入小程序指定页面(传参)
- 阿里巴巴离职DBA_35岁总结的职业生涯
- missing ios distribution signing identity xxx, xcode can request one for you