[英]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.