Подтвердить что ты не робот

Как очистить кеш DNS-клиента System.Net?

Я использую .NET WebRequest при изменении моего файла HOSTS. Я наблюдаю, что System.Net не соблюдает эти изменения - как я могу это сделать?

У меня есть несколько серверов с балансировкой нагрузки за единственным именем хоста, пусть скажем "example.com". Я хочу настроить таргетинг на несколько из них по отдельности, поэтому моя программа будет жестко программировать конкретный IP-адрес устройства в моем файле HOSTS перед отправкой запроса на example.com:

163.56.0.34  example.com

Для первого сервера и первого запроса это работает нормально. Затем моя программа снова меняет файл HOSTS:

163.56.0.48  example.com

И я создаю новый HttpWebRequest. Когда я отправлю это, я могу наблюдать в NETMON, что он переходит на первый IP-адрес (163.56.0.34) вместо ожидаемого второго.

Используя точки останова и трассировки отладки, я проверил, что правильное значение записывается в файл HOSTS каждый раз. Когда я пытаюсь получить доступ к example.com из браузера или другой программы, он выполняет проверку файла HOSTS и переходит ко второму IP-адресу.

Использование NETMON Я проверил, что запросы идут непосредственно на указанный IP-адрес; нет прокси-сервера HTTP.

Поскольку все остальное почитает измененный файл HOSTS, я сильно подозреваю, что инфраструктура System.Net кэшировала ассоциацию DNS-host-IP для example.com. Однако я не могу найти ссылку на это кеширование и не знаю, как очистить его или отключить.

Я бы приветствовал инструкции по работе с кешем, предложения о том, что еще может вызвать эти симптомы, или другие предлагаемые диагностические шаги, которые могут быть полезны.

4b9b3361

Ответ 1

Наконец-то я выкопал скрытую команду из MSDN, которая исправляет это:

ServicePointManager.DnsRefreshTimeout = 0;

Когда я размахивал всеми странными вещами, которые я пробовал раньше, я обнаружил еще одну настройку, которая мне нужна вместе с тем, что было выше; на объекте запроса отключите режим keep-alive:

request.KeepAlive = false;

Ответ 2

Если вы хотите сохранить DnsRefreshTimeout > 0, вы можете обновить кеш, выполнив вызов:

System.Net.Dns.GetHostEntry("example.com");

Ответ 3

вы можете использовать System.Diagnostics.Process для запуска ipconfig/flushdns

Ответ 4

Покойный ответ, но я нашел, что это решение работает лучше, чем принятый ответ. В моем сценарии я тестирую SQL-соединения, и я не мог применить существующий ответ, поскольку у меня нет request.KeepAlive для установки.

Эта страница Брайана Манчини ( "derp turkey" ) подробно описывает его приключение в очистке кеша DNS. Полный реквизит для него, я просто добавляю его решение здесь:

public class DnsUtils  
{        
    [DllImport("dnsapi.dll", EntryPoint="DnsFlushResolverCache")]
    static extern UInt32 DnsFlushResolverCache();

    [DllImport("dnsapi.dll", EntryPoint = "DnsFlushResolverCacheEntry_A")]
    public static extern int DnsFlushResolverCacheEntry(string hostName);

    public static void FlushCache()
    {
        DnsFlushResolverCache();
    }

    public static void FlushCache(string hostName)
    {
        DnsFlushResolverCacheEntry(hostName);
    }
}