繁体   English   中英

ServicePoint安全检查,以防止阻止新的HttpWebRequests

[英]ServicePoint safety checks to prevent blocking on new HttpWebRequests

我正在使用一个进行第三方http调用的第三方库。 通过反编译代码,我确定它正在创建并使用原始HttpWebRequest ,所有这些都将传递到单个URL。 问题是某些请求无法正确关闭。 一段时间后,当库在它们上调用GetRequestStream()*时,所有新的HttpWebRequest永远阻塞。 我已确定此阻止是由于该特定主机的ServicePoint上的ConnectionLimit(默认值为2)引起的。换句话说,库打开了2个请求,然后尝试打开第三个请求。

我想防止这种阻塞。 该库具有相当的弹性,并且可以重新连接自己,因此如果我终止它已建立的现有连接就可以了。 问题是我无权访问此库生成的任何HttpWebRequestHttpWebResponse 但是,我知道它访问的URL,因此可以为其访问ServicePoint

var sp = ServicePointManager.FindServicePoint(new Uri("http://UrlThatIKnowAbout.com"));

(注意:在这些HttpWebRequests上启用了KeepAlive)

尽管我不确定这是否是解决问题的最佳方法,但它确实有效。

  1. 获取URL的服务点对象
    var sp = ServicePointManager.FindServicePoint(new Uri("http://UrlThatIKnowAbout.com"));
  2. ConnectionLimit增加到int.MaxValue
  3. 创建一个后台线程,该线程定期检查服务点上的ConnectionCount 如果超过5,则调用CloseConnectionGroup()
  4. MaxIdleTime设置为1小时(而不是默认值)

设置ConnectionLimit应该可以防止阻塞。 监视线程将确保永远不会激活太多连接。 设置MaxIdleTime应该用作回退。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM