Жизненный цикл объекта .NET ServicePoint - PullRequest
0 голосов
/ 06 декабря 2018

Я установил свойство ServicePoint.ConnectionLeaseTimeout при запуске моего веб-API, чтобы соединения регулярно обновлялись для сценариев балансировки нагрузки с помощью ServicePointManager.FindServicePoint.Но я обнаружил, что через некоторое время после использования HTTP-соединений для ServicePoint значение ServicePoint.ConnectionLeaseTimeout изменилось с моего заданного значения на значение по умолчанию -1.Я определенно не устанавливаю ServicePoint.ConnectionLeaseTimeout на -1 где-нибудь в моем коде, и другие настроенные мной точки обслуживания, которые не использовались для каких-либо соединений, все еще имеют настроенное значение.Итак, я должен предположить, что первоначально настроенная ServicePoint была удалена и заменена новым объектом ServicePoint, где свойство ServicePoint.ConnectionLeaseTimeout имеет значение по умолчанию.

Я знаю, что ServicePoints могут быть удалены при ServicePointManager.MaxServicePoints превышено, но в моем приложении ServicePointManager.MaxServicePoints установлено в 0 (неограниченно).Я также знаю, что ServicePoint может быть удален после превышения ServicePointManager.MaxServicePointIdleTime, но я устанавливаю его в int.MaxValue (~ 25 дней), и это время точно не прошло.

У кого-нибудь естьдругую информацию о том, как управлять жизненным циклом ServicePoint и как лучше управлять конфигурацией ServicePoint (в частности ConnectionLeaseTimeout), не просто находя ServicePoint при запуске приложения и устанавливая его один раз?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Исходный код для ServicePointManager показывает, что TimerThreads используются для удаления объектов ServicePoint, если соединения простаивают дольше, чем ServicePointManager.MaxServicePointIdleTime .По умолчанию это 10 секунд.Каждая ServicePoint будет использовать время простоя, установленное при создании ServicePoint (ссылка на TimerThread.Queue передается в конструктор ServicePoint), поэтому при обновлении ServicePointManager.MaxServicePointIdleTime не будет корректироваться MaxIdleTime любых существующих объектов ServicePoint, поэтомуубедитесь, что настроили это перед использованием любых соединений HTTP.

0 голосов
/ 10 декабря 2018

Исходный код для ServicePointManager показывает, что объекты ServicePoint заключены в объекты WeakReference и хранятся в Hashtable .Тип WeakReference предоставляет ссылку на объект, в то же время позволяя этому объекту утилизироваться сборщиком мусора.Таким образом, это может быть случай, когда сборщик мусора избавился от ServicePoint, а ServicePointManager впоследствии заново сгенерировал новый объект ServicePoint для его замены, который не будет содержать предыдущие значения конфигурации, которые не контролируется ServicePointManager.Похоже, нет способа настроить ConnectionLeaseTimeout статически, чтобы он применялся к вновь созданным объектам ServicePoint.

...