Как очистить DNS-кэш клиента System.Net? - PullRequest
28 голосов
/ 02 сентября 2011

Я использую .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 хост-IP для example.com.Однако я не могу найти ссылку на это кеширование и не знаю, как его очистить или отключить.

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

Ответы [ 4 ]

41 голосов
/ 02 сентября 2011

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

ServicePointManager.DnsRefreshTimeout = 0;

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

request.KeepAlive = false;
6 голосов
/ 08 декабря 2017

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

На этой странице Брайана Манчини («сумасшедший индюк») подробно рассказывается о его приключении по очистке кеша 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);
    }
}
5 голосов
/ 07 июня 2014

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

System.Net.Dns.GetHostEntry("example.com");
3 голосов
/ 02 сентября 2011

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

...