问题描述
用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