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

时间:2011-11-18 21:35:24

标签: c# .net httpwebrequest servicepoint

我正在使用第三方库进行多次http调用。通过反编译代码,我确定它正在创建并使用原始HttpWebRequest,所有这些都将转到单个URL。问题是某些请求无法正常关闭。一段时间后,当库调用GetRequestStream()*时,所有新的HttpWebRequest都会永久阻塞。我已经确定这个阻塞是由于ServicePoint上针对该特定主机的ConnectionLimit,其默认值为2.换句话说,该库已经打开了2个请求,然后尝试打开第3个阻塞。 / p>

我想防止这种阻止。该库具有相当的弹性,可以自行重新连接,所以如果我终止它已经建立的连接就可以了。问题是我无权访问此库所做的任何HttpWebRequestHttpWebResponse。但是我知道它访问的URL,因此我可以访问ServicePoint

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

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

1 个答案:

答案 0 :(得分:1)

这很有效,但我不确定这是解决问题的最佳方法。

  1. 获取网址的服务点对象 var sp = ServicePointManager.FindServicePoint(new Uri("http://UrlThatIKnowAbout.com"));
  2. ConnectionLimit增加到int.MaxValue
  3. 创建一个后台线程,定期检查服务点上的ConnectionCount。如果超过5,请致电CloseConnectionGroup()
  4. MaxIdleTime设置为1小时(而非默认值)
  5. 设置ConnectionLimit可以防止阻止。监视器线程将确保同时永远不会激活太多连接。设置MaxIdleTime应该作为后退。