我正在使用第三方库进行多次http调用。通过反编译代码,我确定它正在创建并使用原始HttpWebRequest
,所有这些都将转到单个URL。问题是某些请求无法正常关闭。一段时间后,当库调用GetRequestStream()*时,所有新的HttpWebRequest
都会永久阻塞。我已经确定这个阻塞是由于ServicePoint上针对该特定主机的ConnectionLimit,其默认值为2.换句话说,该库已经打开了2个请求,然后尝试打开第3个阻塞。 / p>
我想防止这种阻止。该库具有相当的弹性,可以自行重新连接,所以如果我终止它已经建立的连接就可以了。问题是我无权访问此库所做的任何HttpWebRequest
或HttpWebResponse
。但是我知道它访问的URL,因此我可以访问ServicePoint
。
var sp = ServicePointManager.FindServicePoint(new Uri("http://UrlThatIKnowAbout.com"));
(注意:在这些HttpWebRequests上启用了KeepAlive)
答案 0 :(得分:1)
这很有效,但我不确定这是解决问题的最佳方法。
var sp = ServicePointManager.FindServicePoint(new Uri("http://UrlThatIKnowAbout.com"));
ConnectionLimit
增加到int.MaxValue
ConnectionCount
。如果超过5,请致电CloseConnectionGroup()
MaxIdleTime
设置为1小时(而非默认值)设置ConnectionLimit
可以防止阻止。监视器线程将确保同时永远不会激活太多连接。设置MaxIdleTime
应该作为后退。