Правильный способ заставить HttpWebRequest уважать изменения DNS - PullRequest
0 голосов
/ 17 мая 2019

Я заметил, что часто используемые запросы HttpWebRequests никогда не закрывают их базовое соединение, что приводит к тому, что изменения DNS не влияют на последующие подключения HttpWebRequests к той же конечной точке.

После некоторого исследования, я полагаю, это может быть связано с тем, что значение ServicePoint.ConnectionLeaseTimeout по умолчанию равно Timeout.Infinite.

На основе кода ServicePoint.ConnectionLeaseTimeout здесь: https://referencesource.microsoft.com/#system/net/System/Net/ServicePoint.cs,419

и использование ConnectionLeaseTimeoutQueue здесь: https://referencesource.microsoft.com/#system/net/system/Net/_Connection.cs,640

похоже, что повторная установка ConnectionLeaseTimeout безопасна, поскольку обновляет базовый таймер только при изменении значения.

// called frequently enough that the underlying connection is never idle
protected override void ExecuteRequest(Uri endpoint, Uri requestUri)
{
    try
    {
        HttpWebRequest httpRequest = WebRequest.CreateHttp(new Uri(endpoint, requestUri));
        // is this the proper way to do this?
        httpRequest.ServicePoint.ConnectionLeaseTimeout = 30 * 1000;

Является ли приведенный выше код правильным способом проверки того, что .NET будет повторно устанавливать новое соединение с обновленным значением DNS каждые ~ 30 секунд? Я понимаю, что из-за TTL трафик может занять больше 30 секунд.

...