2009-06-08 31 views
9

Windows Hosts file, bir IP'yi normal Internet etki alanı adından çok daha fazla özgürlüğe sahip olan host name ile ilişkilendirmenize olanak tanır. Belirli bir adın geçerli bir "ana bilgisayar" dosya alan adı olup olmadığını belirleyen bir işlev oluşturmak istiyorum. Aynı zamanda Unicode isimlerle çalışması gerektiğini faydayı (temel regex başarısız olur sahiptirBir etki alanı adının "hosts" dosyasında geçerli olup olmayacağını belirlemenin en iyi yolu?

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

: this answer ve çalışır ve ne yaptığının deneylere dayanarak

, bu işlevi ile geldi).

Bunu yapmanın daha iyi/daha zarif bir yolu var mı?

GÜNCELLEME: Bill önerdiği gibi, Uri.CheckHostName yöntem neredeyse ne istiyorum, ama Windows bir "ana" dosyasında izin verdiğini "testi" gibi ana bilgisayar adları için izin vermez. Özel durum "-" kısmı olur, ama daha özel durumlar olduğu için endişeliyim.

cevap

27

System.Uri.CheckHostName() yöntemi nasıl olur?

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

Bu iş neden kendiniz?

+4

Not. – Bill

+0

Bu yöntemi daha önce görmemiştim. Reflektörümde özledim. Benim "http" öneki kesmek daha iyidir, ancak ana dosya bir ad için "-test" izin verir, ancak bu işlev geçersiz olduğunu söylüyor. –

+0

"http" öneki kesmek doğru "-test" durumda, ancak Uri.CheckHostName kullanarak izin vermiyor. –

1

Etki alanı adı "fasdfasdfasd.com" gibi sahte olsa bile, bazı yanıtlar aldığınız için bu yöntemler güvenilir değildir.

En iyi yol bir WebResponse göndermek ve etki alanından yanıtı beklemektir. İşte bu sürecin tam kodu ve açıklamaları (uzun kod snippet'i burada kopyalayıp yapıştırma değil).

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

Teşekkür bile null veya boş dize geçirerek doğru cevabı verir

+4

Katılmıyorum - bu en iyi yol değil. Bu en sağlam yoldur (çünkü artık bir alanın geçerli olduğuna dair bir şüphe duymadan biliyorsunuz). Ancak .. alan adı herhangi bir yerde kayıtlı değilse veya barındırılmamışsa veya ağ üzerinden size ulaşamıyorsa veya bir sebepten ötürü ne olur? Bu durumlarda geçerli bir alan üzerinde en az ve mümkün daha fazla başarısız olur. –

+0

Etki alanının kayıtlı olduğundan emin olmak için whois'yi sorgulamanız gerekir. – Yanga