Проверки безопасности в ServicePoint для предотвращения блокировки новых HttpWebRequests - PullRequest
1 голос
/ 19 ноября 2011

Я использую стороннюю библиотеку, которая делает несколько http-вызовов.Декомпилировав код, я определил, что он создает и использует необработанные HttpWebRequest, все они идут по одному URL.Проблема в том, что некоторые запросы не закрываются должным образом.Через некоторое время все новые HttpWebRequest блокируются навсегда, когда библиотека вызывает для них функцию GetRequestStream () *.Я определил, что эта блокировка происходит из-за ConnectionLimit в ServicePoint для этого конкретного хоста, который имеет значение по умолчанию 2. Другими словами, библиотека открыла 2 запроса, а затем пытается открыть третий, который блокирует.

Я хочу защитить от этой блокировки.Библиотека достаточно устойчива и будет восстанавливать соединение, так что все в порядке, если я уничтожу существующие подключения, которые она установила.Проблема в том, что у меня нет доступа ни к одному из HttpWebRequest или HttpWebResponse, которые делает эта библиотека.Однако я знаю URL, к которому он обращается, и поэтому могу получить к нему доступ ServicePoint.

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

(Примечание: KeepAlive включен в этих запросах HttpWebRequest)

1 Ответ

1 голос
/ 23 мая 2014

Это сработало, хотя я не уверен, что это лучший способ решить проблему.

  1. Получить объект точки обслуживания для URL
    var sp = ServicePointManager.FindServicePoint(new Uri("http://UrlThatIKnowAbout.com"));
  2. Увеличить ConnectionLimit до int.MaxValue
  3. Создать фоновый поток, который периодическипроверяет ConnectionCount в пункте обслуживания.Если значение превышает 5, позвоните CloseConnectionGroup()
  4. Установите MaxIdleTime на 1 час (вместо значения по умолчанию)

Установка ConnectionLimit должна предотвратить блокировку.Поток монитора гарантирует, что слишком много подключений никогда не будут активными одновременно.Установка MaxIdleTime должна служить отступлением.

...