zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Java爬取丁香医生疫情数据并存储至数据库
    mysql 获取昨天日期、今天日期、明天日期以及前一个小时和后一个小时的时间
    java.lang.UnsatisfiedLinkError: /usr/openv/java/jre/lib/amd64/libawt_xawt.so: libXtst.so.6: cannot open shared object file: No such file or directory
    Linux下打包压缩war、解压war包和jar命令
    Linux常用基本命令大全
    Git在eclipse中的配置
    CentOS 7 安装Rabbitmq
    Jmeter测试普通java类说明
    单例模式的7中写法
    Hyperledger Fabric 1.0 学习搭建 (五)--- 启动Fabric多节点集群
  • 原文地址:https://www.cnblogs.com/johnblogs/p/12470058.html
Copyright © 2011-2022 走看看