Проверки безопасности ServicePoint для предотвращения блокировки новых HttpWebRequests

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

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

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам