विंडोज 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 एक "मेजबान" फ़ाइल में अनुमति देता है की तरह होस्ट नाम के लिए अनुमति नहीं है। मैं विशेष मामला "-" भाग लेता हूं, लेकिन मुझे चिंता है कि अधिक विशेष मामले हैं।
ध्यान दें कि यहां तक कि शून्य या खाली स्ट्रिंग गुजर सही जवाब देता है। – Bill
मैंने पहले इस विधि को नहीं देखा था। मैं इसे अपने परावर्तक में याद किया। यह मेरे "http" उपसर्ग हैक से बेहतर है, लेकिन मेजबान फ़ाइल किसी नाम के लिए "-टेस्ट" की अनुमति देती है, लेकिन यह फ़ंक्शन कहता है कि यह अमान्य है। –
"http" उपसर्ग हैक सही ढंग से "-टेस्ट" केस की अनुमति देता है, लेकिन केवल Uri.CheckHostName का उपयोग करने की अनुमति नहीं देता है। –