2009-06-08 12 views
9

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.

Respuesta

27

¿Qué tal el método System.Uri.CheckHostName()?

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

¿Por qué hacer el trabajo usted mismo?

+4

en cuenta que incluso pasando cadena nula o vacía devuelve la respuesta correcta. – Bill

+0

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. –

+0

El hack de prefijo "http" permite el caso "-test", pero el uso de Uri.CheckHostName no lo permite. –

1

Estos métodos no son confiables ya que se obtiene una respuesta incluso si el nombre de dominio es falso como "fasdfasdfasd.com".

La mejor manera es enviar un WebResponse y esperar la respuesta del dominio. Aquí está el código completo y las explicaciones de este proceso (fragmento de código largo para no copiar y pegar aquí).

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

Gracias

+4

No estoy de acuerdo, esta no es la mejor manera. es la forma más robusta (porque ahora sabes sin lugar a dudas que el dominio es válido). Sin embargo, ¿qué ocurre si el dominio no está registrado ni alojado en ninguna parte, o no está disponible para usted en la red, o simplemente está inactivo por alguna razón? Esto fallará en un dominio válido en esos casos al menos y posiblemente más. –

+0

Debería consultar el whois en su lugar para asegurarse de que el dominio ha sido registrado – Yanga

Cuestiones relacionadas