2009-06-08 14 views
9

Windows Hosts file consente di associare un IP a host name che ha una maggiore libertà rispetto a un normale nome di dominio Internet. Mi piacerebbe creare una funzione che determina se un determinato nome sarebbe un nome di dominio di file "host" valido.Il modo migliore per determinare se un nome di dominio sarebbe valido in un file "host"?

Sulla base this answer e sperimentazione di ciò che funziona e non lo fa, mi si avvicinò con questa funzione:

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

Essa ha anche il vantaggio che dovrebbe funzionare con i nomi Unicode (dove una regex base fallirebbe).

Esiste un modo migliore/più elegante per farlo?

UPDATE: Come suggerito dal Bill, il metodo Uri.CheckHostName fa quasi quello che voglio, ma non consente nomi host come "-test" che Windows permette in un file "hosts". Vorrei caso speciale la parte "-", ma sono preoccupato che ci siano più casi speciali.

risposta

27

E il metodo System.Uri.CheckHostName()?

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

Perché fare il lavoro da soli?

+4

notare che anche passando stringa null o vuota restituisce la risposta corretta. – Bill

+0

Non avevo ancora visto questo metodo. L'ho perso nel mio Reflector-ing. È meglio del mio hack "http", ma il file hosts consente "-test" per un nome, ma questa funzione dice che non è valido. –

+0

Il prefisso "http" hack correttamente consente il caso "-test", ma l'utilizzo di Uri.CheckHostName non lo consente. –

1

Questi metodi non sono affidabili poiché si ottiene una risposta anche se il nome del dominio è falso come "fasdfasdfasd.com".

Il modo migliore è inviare una risposta Web e attendere la risposta dal dominio. Ecco il codice completo e le spiegazioni di questo processo (snippet di codice lungo quindi non copia-incolla qui).

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

Grazie

+4

Non sono d'accordo - questo non è il modo migliore. è il modo più efficace (perché ora sai senza ombra di dubbio che il dominio è valido). Tuttavia ... cosa succede se il dominio non è registrato o ospitato da nessuna parte, o non è disponibile per te in rete, o è semplicemente inattivo per qualche motivo? Questo fallirà su un dominio valido in quei casi almeno e possibilmente di più. –

+0

È necessario interrogare il whois per assicurarsi che il dominio sia stato registrato – Yanga

Problemi correlati