簡體   English   中英

如何清除System.Net客戶端DNS緩存?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM