2011-09-01 21 views
24

मैं अपनी HOSTS फ़ाइल को बदलते समय .NET WebRequest का उपयोग कर रहा हूं। मैं देख रहा हूं कि System.Net उन परिवर्तनों का सम्मान नहीं करता है - मैं इसे ऐसा कैसे कर सकता हूं?मैं System.Net क्लाइंट DNS कैश को कैसे साफ़ करूं?

मैं सर्वर से एक होस्टनेम पीछे लोड संतुलित की एक संख्या है, मान लीजिए कि 'example.com' करते हैं। मैं व्यक्तिगत रूप से उनमें से कई को लक्षित करना चाहते, इसलिए मेरे कार्यक्रम हार्ड कोड मशीन विशिष्ट मेरी मेजबानों में आईपी पते example.com के लिए एक अनुरोध भेजने से पहले दाखिल होगा: पहली बार सर्वर और पहली अनुरोध के लिए

163.56.0.34 example.com 

, यह ठीक काम करता है। तब मेरे कार्यक्रम में परिवर्तन मेजबानों फिर से फाइल:

163.56.0.48 example.com 

और मैं HttpWebRequest एक नया बना सकते हैं। जब मैं इसे एक भेजता हूं, तो मैं नेटमॉन में देख सकता हूं कि यह अपेक्षित दूसरे के बजाय पहले आईपी पते (163.56.0.34) पर जाता है।

breakpoints और डिबग निशान का उपयोग करना, मैं सत्यापित किया है कि सही मान लिखा हो जाता है करने के लिए होस्ट हर बार फाइल। जब मैं किसी ब्राउज़र या अन्य प्रोग्राम से example.com तक पहुंचने का प्रयास करता हूं, तो यह HOSTS फ़ाइल का सम्मान करता है और दूसरे आईपी पते पर जाता है।

Netmon का उपयोग करते हुए मैं सत्यापित किया है कि अनुरोध दिखाया आईपी पते के लिए सीधे जा रहे हैं; कोई HTTP प्रॉक्सी नहीं है।

के बाद से सब कुछ का सम्मान है बदली हुई मेजबान फ़ाइल, मैं दृढ़ता से संदेह है कि System.Net बुनियादी ढांचे example.com के लिए DNS मेजबान आईपी संघ कैश की गई है। हालांकि, मुझे इस कैशिंग का कोई संदर्भ नहीं मिल सकता है, और इसे फ्लश करने या इसे बंद करने का कोई तरीका नहीं पता है।

मैं कैश से निपटने के लिए दिए गए निर्देशों का स्वागत करेंगे, और क्या इन लक्षणों, या अन्य प्रस्तावित नैदानिक ​​चरण हैं, जो उपयोगी हो सकता है कारण हो सकता है के लिए सुझाव।

उत्तर

37

मैं अंत में है कि यह समस्या नहीं MSDN से अस्पष्ट कमान अपने हाथ में खोदा:

ServicePointManager.DnsRefreshTimeout = 0; 

जैसा कि मैंने सब अजीब बातें मैं खुला हुआ डी पहले कोशिश की, मैंने एक और सेटिंग की खोज की जिसे मुझे उपर्युक्त के साथ चाहिए; अनुरोध वस्तु पर, बंद कर देते हैं रखें जिंदा:

request.KeepAlive = false; 
+1

KeepAlive को झूठी पर सेट करने के परिणामस्वरूप प्रत्येक अनुरोध के लिए एक टीसीपी हैंडशेक होगा। आप सर्विसपॉइंट को प्रबंधित करके एक मध्यम जमीन पर हमला कर सकते हैं।कनेक्शन LeaseTimeout ताकि आप कुछ कनेक्शन का पुन: उपयोग कर सकें, फिर भी पुनः कनेक्ट होने पर संभावित परिवर्तनों के लिए DNS की जांच कर रहे हों। – ScottS

3

आप ipconfig लांच करने के लिए इस्तेमाल कर सकते हैं System.Diagnostics.Process/flushdns

+4

मुझे लगता है कि कोशिश की और यह काम नहीं किया है - यह मशीन के DNS कैश flushes, लेकिन नहीं System.Net की प्रक्रिया स्तरीय कैश। – Bruce

5

आप> 0 है तो आप यहां कॉल करके कैश अद्यतन कर सकते हैं DnsRefreshTimeout रखना चाहते हैं:

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

एक देर से जवाब देने के लिए सुनिश्चित करें, लेकिन मैंने पाया कि यह समाधान स्वीकार किए गए उत्तर से बेहतर काम करता है। मेरे परिदृश्य में मैं SQL कनेक्शन का परीक्षण कर रहा हूं, और मैं मौजूदा उत्तर लागू नहीं कर सका क्योंकि मेरे पास सेट करने के लिए request.KeepAlive नहीं है।

This page ब्रायन मैनसिनी ("Derp टर्की") 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); 
    } 
}