2009-06-08 15 views
9

विंडोज Hosts file आपको एक आईपी को host name से जोड़ने की अनुमति देता है जो सामान्य इंटरनेट डोमेन नाम से कहीं अधिक स्वतंत्रता प्राप्त करता है। मैं एक ऐसा फ़ंक्शन बनाना चाहता हूं जो निर्धारित करता है कि कोई दिया गया नाम वैध "होस्ट" फ़ाइल डोमेन नाम होगा या नहीं।यह निर्धारित करने का सबसे अच्छा तरीका है कि डोमेन नाम "होस्ट" फ़ाइल में मान्य होगा या नहीं?

private static bool IsValidDomainName(string domain) 
{ 
    if (String.IsNullOrEmpty(domain) || domain.Length > 255) 
    { 
     return false; 
    } 

    Uri uri; 

    if (!Uri.TryCreate("http://" + domain, UriKind.Absolute, out uri)) 
    { 
     return false; 
    } 

    if (!String.Equals(uri.Host, domain, StringComparison.OrdinalIgnoreCase) || !uri.IsWellFormedOriginalString()) 
    { 
     return false; 
    } 

    foreach (string part in uri.Host.Split('.')) 
    { 
     if (part.Length > 63) 
     { 
      return false; 
     } 
    } 

    return true; 
} 

यह भी लाभ यह है कि यह यूनिकोड नाम के साथ काम करना चाहिए (जहां एक बुनियादी regex विफल हो जाएगा है:

पर this answer और क्या काम करता है और नहीं है के प्रयोग के आधार पर, मैं इस समारोह के साथ आया था)।

क्या ऐसा करने के लिए एक बेहतर/अधिक सुरुचिपूर्ण तरीका है?

अद्यतन: Bill ने सुझाव दिया है, Uri.CheckHostName विधि लगभग जो मैं चाहता है, लेकिन यह "टेस्ट" है कि Windows एक "मेजबान" फ़ाइल में अनुमति देता है की तरह होस्ट नाम के लिए अनुमति नहीं है। मैं विशेष मामला "-" भाग लेता हूं, लेकिन मुझे चिंता है कि अधिक विशेष मामले हैं।

उत्तर

27

System.Uri.CheckHostName() विधि के बारे में कैसे?

private static bool IsValidDomainName(string name) 
{ 
    return Uri.CheckHostName(name) != UriHostNameType.Unknown; 
} 

स्वयं काम क्यों करें?

+4

ध्यान दें कि यहां तक ​​कि शून्य या खाली स्ट्रिंग गुजर सही जवाब देता है। – Bill

+0

मैंने पहले इस विधि को नहीं देखा था। मैं इसे अपने परावर्तक में याद किया। यह मेरे "http" उपसर्ग हैक से बेहतर है, लेकिन मेजबान फ़ाइल किसी नाम के लिए "-टेस्ट" की अनुमति देती है, लेकिन यह फ़ंक्शन कहता है कि यह अमान्य है। –

+0

"http" उपसर्ग हैक सही ढंग से "-टेस्ट" केस की अनुमति देता है, लेकिन केवल Uri.CheckHostName का उपयोग करने की अनुमति नहीं देता है। –

1

इन विधियों के रूप में आप कुछ प्रतिक्रिया भले ही डोमेन नाम की तरह "fasdfasdfasd.com" नकली है मिल विश्वसनीय नहीं हैं।

वेब रेस्पॉन्स भेजने और डोमेन से प्रतिक्रिया के लिए सबसे अच्छा तरीका है। यहां इस प्रक्रिया का पूरा कोड और स्पष्टीकरण दिया गया है (लंबी कोड स्निपेट इसलिए कॉपी-पेस्टिंग नहीं है)।

http://www.dotnetfunda.com/articles/show/1072/validating-domain-name-in-aspnet

धन्यवाद

+4

मैं असहमत हूं - यह सबसे अच्छा तरीका नहीं है। यह सबसे मजबूत तरीका है (क्योंकि अब आप संदेह की छाया के बिना जानते हैं कि डोमेन मान्य है)। हालांकि .. क्या होगा यदि डोमेन कहीं भी पंजीकृत या होस्ट नहीं है, या नेटवर्क पर आपके लिए उपलब्ध नहीं है, या किसी कारण से बस नीचे है? यह कम से कम और संभवतः उन मामलों में वैध डोमेन पर असफल हो जाएगा। –

+0

यह सुनिश्चित करने के लिए कि डोमेन पंजीकृत है, आपको इसके बारे में पूछना चाहिए – Yanga