Проверки безопасности 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 ответ
Это сработало, хотя я не уверен, что это лучший способ решить проблему.
- Получить объект точки обслуживания для URL
var sp = ServicePointManager.FindServicePoint(new Uri("http://UrlThatIKnowAbout.com"));
- Увеличить
ConnectionLimit
вint.MaxValue
- Создать фоновый поток, который периодически проверяет
ConnectionCount
на сервисной точке. Если оно превышает 5, звонитеCloseConnectionGroup()
- Задавать
MaxIdleTime
до 1 часа (вместо значения по умолчанию)
Настройка ConnectionLimit
должен предотвратить блокировку. Поток монитора гарантирует, что слишком много соединений никогда не будут активными одновременно. настройка MaxIdleTime
должен послужить отступлением.