Windows Hosts file le permite asociar una dirección IP a un host name que tiene mucha más libertad que un nombre de dominio de Internet normal. Me gustaría crear una función que determine si un nombre de pila sería un nombre de dominio de archivo "host" válido.¿La mejor manera de determinar si un nombre de dominio sería válido en un archivo "hosts"?
Basado en this answer y experimentación de lo que funciona y no lo hace, se me ocurrió con esta función:
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;
}
También tiene la ventaja de que debe trabajar con nombres Unicode (donde una expresión regular básica fallaría)
¿Hay una manera mejor/más elegante de hacer esto?
ACTUALIZACIÓN: Según lo sugerido por Bill, el método Uri.CheckHostName casi hace lo que yo quiero, pero no permite nombres de host como "test" que Windows permite en un archivo "hosts". Sería un caso especial la parte "-", pero me preocupa que haya más casos especiales.
en cuenta que incluso pasando cadena nula o vacía devuelve la respuesta correcta. – Bill
No había visto este método antes. Lo extrañé en mi Reflector-ing. Es mejor que mi hack de prefijo "http", pero el archivo de hosts permite "-test" para un nombre, pero esta función dice que no es válido. –
El hack de prefijo "http" permite el caso "-test", pero el uso de Uri.CheckHostName no lo permite. –