Лучший способ определить, будет ли доменное имя допустимым в файле "hosts"? - PullRequest
13 голосов
/ 09 июня 2009

Файл Windows Hosts позволяет связать IP-адрес с именем хоста , которое обладает гораздо большей свободой, чем обычное доменное имя в Интернете. Я хотел бы создать функцию, которая определяет, будет ли данное имя допустимым именем файлового домена "host".

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

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 (где базовое регулярное выражение не будет работать).

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

ОБНОВЛЕНИЕ : Как подсказывает Билл , метод Uri.CheckHostName почти делает то, что я хочу, но он не позволяет использовать такие имена хостов, как -test ", что Windows позволяет в файле" hosts ". Я бы выделил часть «-», но я обеспокоен тем, что есть и более особые случаи.

Ответы [ 2 ]

32 голосов
/ 09 июня 2009

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

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

Почему работаешь сама?

1 голос
/ 26 ноября 2014

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

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

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

Спасибо

...