• 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设置得再大,依然会有排队等待超时的出现,因为养成良好的编程习惯:

    如果request不是必须的要keepalive的,那么就要设置KeepAlive为false: reqest.KeepAlive = false;
    以及做对应的收尾动作:

    if (response != null)
    {
    response.Close();
    }
    if (request != null)
    {
    request.Abort();
    }
    ————————————————

    版权声明:本文为CSDN博主「jiangyuqing1」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/jiangyuqing1/article/details/39498551

  • 相关阅读:
    Day9
    Day9
    Day9
    洛谷 P1896 [SCOI2005]互不侵犯
    洛谷 P1879 [USACO06NOV]玉米田Corn Fields
    Day9
    最大m段子段和 Day9
    jsp内置对象-application对象
    jsp内置对象-session对象
    jsp内置对象-response对象
  • 原文地址:https://www.cnblogs.com/johnblogs/p/12470058.html
Copyright © 2020-2023  润新知