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, в файле «хостов». В частном случае я бы включил часть «-», но меня беспокоят более частные случаи.
Обратите внимание, что даже проходя нуль или пустую строку возвращает правильный ответ. – Bill
Я раньше этого не видел. Я пропустил это в своем Рефлектору. Это лучше, чем мой «префикс http», но файл hosts позволяет «-test» для имени, но эта функция говорит, что это неверно. –
«Префикс префикса http» правильно разрешает «тест», но просто использование Uri.CheckHostName не позволяет. –