1

我正在使用一个 3rd 方库,它可以进行许多 http 调用。通过反编译代码,我确定它正在创建和使用 raw HttpWebRequest,所有这些都指向一个 URL。问题是某些请求没有正确关闭。一段时间后,HttpWebRequest当库对它们调用 GetRequestStream()* 时,所有 new 都会永远阻塞。我已经确定此阻塞是由于该特定主机的 ServicePoint 上的 ConnectionLimit,其默认值为 2。换句话说,该库已打开 2 个请求,然后尝试打开第 3 个请求,这会阻塞。

我想防止这种阻塞。该库具有相当的弹性,并且会自行重新连接,因此如果我终止它已建立的现有连接也没关系。问题是我无权访问这个库制作的HttpWebRequest任何东西。HttpWebResponse但是我确实知道它访问的 URL,因此我可以访问ServicePoint它。

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

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

4

1 回答 1

1

这行得通,尽管我不确定这是解决问题的最佳方法。

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

设置ConnectionLimit应该防止阻塞。监控线程将确保不会有太多的连接同时处于活动状态。设置MaxIdleTime应作为后备。

于 2014-05-22T20:59:02.567 回答