How do I clear System.Net client DNS cache?

22,460

Solution 1

I finally dug up the obscure command from MSDN that fixes this:

ServicePointManager.DnsRefreshTimeout = 0;

As I unwound all the weird things I'd tried previously, I discovered one other setting that I need along with the one above; on the request object, turn off keep-alive:

request.KeepAlive = false;

Solution 2

A late answer to be sure, but I found this solution worked better than the accepted answer. In my scenario I am testing SQL connections, and I couldn't apply the existing answer since I have no request.KeepAlive to set.

This page by Brian Mancini ("derp turkey") details his adventure in clearing the DNS cache. Full props to him, I'm just adding his solution here:

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);
    }
}

Solution 3

If you want to keep the DnsRefreshTimeout > 0 then you can update the cache by making a call to:

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

Solution 4

you could use System.Diagnostics.Process to launch ipconfig /flushdns

Share:
22,460
lbrndnr
Author by

lbrndnr

Dev lead at Chase, avid Science Fiction reader, devoted husband and father of three.

Updated on December 03, 2021

Comments

  • lbrndnr
    lbrndnr over 2 years

    I'm using the .NET WebRequest while changing my HOSTS file. I'm observing that System.Net doesn't honor those changes - how can I make it do so?

    I have a number of servers load-balanced behind a single hostname, let's say 'example.com'. I want to target several of them individually, so my program will hard-code the machine-specific IP address in my HOSTS file before sending a request to example.com:

    163.56.0.34  example.com
    

    For the first server and first request, this works fine. Then my program changes the HOSTS file again:

    163.56.0.48  example.com
    

    And I create a new HttpWebRequest. When I send this one off, I can observe in NETMON that it goes to the first IP address (163.56.0.34) instead of the expected second one.

    Using breakpoints and debug traces, I've verified that the correct value does get written to the HOSTS file each time. When I attempt to access example.com from a browser or other program, it does honor the HOSTS file and go to the second IP address.

    Using NETMON I've verified that requests are going directly to the IP address shown; there is no HTTP proxy.

    Since everything else is honoring the changed HOSTS file, I strongly suspect that the System.Net infrastructure has cached the DNS host-IP association for example.com. However, I can find no reference to this caching, and know of no way to flush it or turn it off.

    I would welcome instructions for dealing with the cache, suggestions for what else might be causing these symptoms, or other proposed diagnostic steps that might be useful.

  • lbrndnr
    lbrndnr over 12 years
    I tried that and it didn't work - it flushes the machine's DNS cache, but not System.Net's process-level cache.
  • ScottS
    ScottS over 6 years
    Setting KeepAlive to false will result in a TCP handshake for every request. You can strike a middle ground by managing the ServicePoint.ConnectionLeaseTimeout so that you can reuse some connections, while still checking the DNS for possible changes on reconnect.
  • wan_keen
    wan_keen over 5 years
    Thanks so much mate!
  • KevinBui
    KevinBui over 3 years
    for one who work with soap service using WCF ClientBase<T> instead of HttpWebRequest or WebClient stackoverflow.com/a/6535452/836376
  • Wiktor Zychla
    Wiktor Zychla over 3 years
    Kind of "you can restart the server" advice.
  • Boppity Bop
    Boppity Bop over 3 years
    Haha - reinstall windows!
  • jk7
    jk7 about 3 years
    Based on the Brian Mancini ("derp turkey") blog page referenced in Ian's answer, GetHostEntry() uses the cache. So this isn't a way to ensure the cache entry is cleared for that host name.
  • Daniele
    Daniele about 2 years
    wow this worked for me when I had lost all hope, thanks!