如何清除System.Net客户端DNS缓存

本文关键字:Net 客户端 DNS 缓存 System 何清除 清除 | 更新日期: 2023-09-27 18:07:32

我正在使用。net WebRequest,同时更改我的HOSTS文件。我在观察这个系统。Net不支持这些改变——我怎样才能让它这样做呢?

我在一个主机名后面有许多服务器负载均衡,我们说'example.com'。我想单独针对其中的几个,所以我的程序将在向example.com发送请求之前在HOSTS文件中硬编码特定于机器的IP地址:

163.56.0.34  example.com

对于第一个服务器和第一个请求,这工作得很好。然后我的程序再次更改HOSTS文件:

163.56.0.48  example.com

我创建一个新的HttpWebRequest。当我发送这个时,我可以在NETMON中观察到它转到第一个IP地址(163.56.0.34),而不是预期的第二个IP地址。

使用断点和调试跟踪,我已经验证了每次都将正确的值写入HOSTS文件。当我尝试从浏览器或其他程序访问example.com时,它确实遵守HOSTS文件并转到第二个IP地址。

使用NETMON,我已经验证了请求是直接到显示的IP地址;没有HTTP代理。

由于其他所有内容都支持更改后的HOSTS文件,因此我强烈怀疑系统。Net基础架构缓存了example.com的DNS主机- ip关联。但是,我找不到此缓存的参考,并且不知道如何刷新或关闭它。

欢迎有关处理缓存的说明、其他可能导致这些症状的原因的建议,或其他可能有用的建议诊断步骤。

如何清除System.Net客户端DNS缓存

我终于从MSDN中找到了修复此问题的模糊命令:

ServicePointManager.DnsRefreshTimeout = 0;

当我解开之前尝试过的所有奇怪的东西时,我发现了除了上面的设置之外,我还需要另一个设置;在请求对象上,关闭keep-alive:

request.KeepAlive = false;

一个迟来的答案,但我发现这个解决方案比公认的答案更有效。在我的情况下,我正在测试SQL连接,我不能应用现有的答案,因为我没有request.KeepAlive设置。

这个页面由Brian Mancini("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);
    }
}

如果你想保持DnsRefreshTimeout> 0,那么你可以通过调用:

来更新缓存:
System.Net.Dns.GetHostEntry("example.com");

您可以使用System.Diagnostics.Process启动ipconfig/flushdns