2009-06-08 38 views
9

Windows Hosts file cho phép bạn liên kết IP với số host name có quyền tự do lớn hơn nhiều so với tên miền Internet thông thường. Tôi muốn tạo một hàm xác định nếu một tên đã cho sẽ là tên miền tệp "máy chủ lưu trữ" hợp lệ.Cách tốt nhất để xác định xem tên miền có hợp lệ trong tệp "máy chủ lưu trữ" không?

Dựa trên this answer và thử nghiệm những gì làm việc và không, tôi đã đưa ra chức năng này:

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

Nó cũng có những lợi ích mà nó nên làm việc với tên Unicode (nơi một regex cơ bản sẽ thất bại).

Có cách nào tốt hơn/thanh lịch hơn để thực hiện việc này không?

CẬP NHẬT: Theo đề nghị của Bill, phương pháp Uri.CheckHostName hầu hết những gì tôi muốn, nhưng nó không cho phép đối với tên máy chủ như "-test" rằng Windows cho phép trong một "hosts" file. Tôi sẽ đặc biệt trường hợp "-" một phần, nhưng tôi lo ngại có nhiều trường hợp đặc biệt.

Trả lời

27

Phương thức System.Uri.CheckHostName() như thế nào?

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

Tại sao tự làm việc?

+4

Lưu ý rằng ngay cả đi qua chuỗi null hoặc rỗng trả về câu trả lời đúng. – Bill

+0

Tôi chưa từng thấy phương pháp này trước đây. Tôi đã bỏ lỡ nó trong Reflector-ing của tôi. Nó tốt hơn so với "http" tiền tố hack của tôi, nhưng các tập tin host cho phép "-test" cho một tên, nhưng chức năng này nói rằng nó không hợp lệ. –

+0

Tiền tố "http" hack chính xác cho phép trường hợp "-test", nhưng chỉ sử dụng Uri.CheckHostName không cho phép. –

1

Những phương pháp này không đáng tin cậy khi bạn nhận được một số phản hồi ngay cả khi tên miền là giả mạo như "fasdfasdfasd.com".

Cách tốt nhất là gửi WebResponse và đợi phản hồi từ miền. Đây là mã hoàn chỉnh và giải thích về quá trình này (đoạn mã dài để không sao chép ở đây).

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

Cảm ơn

+4

Tôi không đồng ý - đây không phải là cách tốt nhất. nó là cách mạnh mẽ nhất (bởi vì bây giờ bạn biết mà không có một cái bóng nghi ngờ rằng tên miền là hợp lệ). Tuy nhiên .. điều gì sẽ xảy ra nếu miền không được đăng ký hoặc lưu trữ ở bất kỳ nơi nào hoặc không có sẵn cho bạn qua mạng hoặc chỉ vì một lý do nào đó? Điều này sẽ thất bại trên một tên miền hợp lệ trong những trường hợp đó ít nhất và có thể nhiều hơn. –

+0

Bạn nên truy vấn whois để đảm bảo rằng miền đã được đăng ký – Yanga

Các vấn đề liên quan