HttpWebRequest的偶尔请求超时问题研究

问题描述

    用HttpWebRequest.Create(uri)来构造一个HttpWebRequest请求request,但request.GetResponse()不是每次都成功,失败时提示操作超时。很奇怪的是,若在这个request之前只出现不超过2个HttpWebRequest时,当前的request.GetResponse就能成功,对于多线程来讲只能跑两个thread,这不很蛋疼吗!

初步解决方案

     经过实验知道不超过2HttpWebRequest就能成功,说明系统那边一定有个阀值来控制请求数目。果然查阅资料得知, http 1.0 和 http 1.1 标准规定并发连接数最大为2而.Net Framework 依然遵循这个规则,但目前多数浏览器已经放弃这一原则了。既然如此针对这一问题的解决方案就自然而然的有了:

方法一:System.Net.ServicePointManager.DefaultConnectionLimit对应默认连接数目,将该属性的数值修改大点10,100,1000都可以根据需求来定,但也不能太大,原因后面详解;

方法二:修改配置文件,在syste.net标签下添加<connectionManagement>,填写网站地址(*代表所有),及其最大访问连接数,如下:

<system.net>
    <connectionManagement>
        <add address = "*" maxconnection = "100" />
    </connectionManagement>
</system.net>

     对于设置阀值,首先想得到是:这些连接占用资源了。确实如此,request和response,以及在读取response的流都需要关闭,这样垃圾回收机制才能尽快回收资源,例如在本文讨论的问题中,如果不关闭连接,即使将maxconnection设置得再大,依然会有排队等待超时的出现,因为养成良好的编程习惯:

  1. 如果request不是必须的要keepalive的,那么就要设置KeepAlive为false: reqest.KeepAlive = false;
  2. 以及做对应的收尾动作:
    if (response != null)
    {
        response.Close();
    }
    if (request != null)
    {
        request.Abort();
    }


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值