[英]How do I clear System.Net client DNS cache?
我在更改我的HOSTS文件时使用.NET WebRequest。 我观察到System.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文件,因此我强烈怀疑System.Net基础结构已缓存example.com的DNS主机-IP关联。 但是,我找不到对此缓存的引用,并且知道无法刷新或关闭它。
我欢迎处理缓存的说明,可能导致这些症状的其他建议,或其他可能有用的诊断步骤。
我终于从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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.