2009-06-08 3 views
9

Windows Hosts file позволяет связать IP с host name, который имеет гораздо большую свободу, чем обычное доменное имя в Интернете. Я хотел бы создать функцию, которая определяет, является ли данное имя допустимым доменным именем файла хоста.Лучший способ определить, будет ли доменное имя действительным в файле «hosts»?

на основе this answer и экспериментирования, что работает и не я придумал эту функцию:

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; 
} 

Он также имеет то преимущество, что он должен работать с именами Unicode (где основное регулярное выражение потерпит неудачу).

Есть ли лучший/более элегантный способ сделать это?

UPDATE: Как было предложено Bill, метод Uri.CheckHostName почти делает то, что я хочу, но это не позволяет имена хостов, как «-test», что позволяет Windows, в файле «хостов». В частном случае я бы включил часть «-», но меня беспокоят более частные случаи.

ответ

27

Как насчет метода System.Uri.CheckHostName()?

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

Зачем нужна работа самостоятельно?

+4

Обратите внимание, что даже проходя нуль или пустую строку возвращает правильный ответ. – Bill

+0

Я раньше этого не видел. Я пропустил это в своем Рефлектору. Это лучше, чем мой «префикс http», но файл hosts позволяет «-test» для имени, но эта функция говорит, что это неверно. –

+0

«Префикс префикса http» правильно разрешает «тест», но просто использование Uri.CheckHostName не позволяет. –

1

Эти методы ненадежны, так как вы получаете некоторый отклик, даже если доменное имя является поддельным, как «fasdfasdfasd.com».

Лучший способ - отправить WebResponse и дождаться ответа от домена. Вот полный код и объяснения этого процесса (длинный фрагмент кода, а не копирование).

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

Благодаря

+4

Я не согласен - это не лучший способ. это самый надежный способ (потому что теперь вы знаете без тени сомнения, что домен действителен). Однако .. что, если домен не зарегистрирован или размещен нигде, или недоступен для вас по сети, или просто по какой-то причине? Это приведет к сбою в действительном домене в тех случаях, по крайней мере, и возможно больше. –

+0

Вы должны запросить whois вместо этого, чтобы убедиться, что домен зарегистрирован – Yanga