2010-09-09 32 views
9

Tôi cần phương thức xác thực Uri. Vì vậy, chuỗi như:Xác thực Uri từ chuỗi

"http://www.google.com", "www.google.com", "google.com"

..must được xác nhận như Uri của. Và các chuỗi thông thường như "google" không được xác thực là của Uri. Để thực hiện việc kiểm tra này, tôi sử dụng hai phương thức: UriBuilder và Uri.TryCreate().

Vấn đề với UriBuilder là bất kỳ chuỗi nào tôi đưa ra, nó trả về một Uri. Khi tôi vượt qua một chuỗi bình thường trong constructor của nó, nó mang lại cho nó một kế hoạch và trả về "http://google/" mà không phải là hành vi mà tôi muốn.

Vấn đề với Uri.TryCreate() là, trong khi nó hoạt động tốt với "http://www.google.com" và "www.google.com", khi tôi cho nó "google.com", nó không xác thực là Uri.

Tôi đã nghĩ đến việc kiểm tra chuỗi, nếu nó bắt đầu bằng http: // hoặc www, hãy gửi chuỗi đó đến lớp UriBuilder, nhưng điều này không giúp với "google.com" mà cũng phải là Uri.

Tôi làm cách nào để xác thực các nội dung như "google.com" dưới dạng Uri chứ không phải "google"? Việc kiểm tra kết thúc chuỗi cho .com, .net, .org dường như không linh hoạt.

+2

bạn có thể xác minh xem bạn đang tìm kiếm để xác thực URL hoặc URI không? Câu hỏi của bạn hơi khó hiểu. – slugster

+0

@Slugster - sau khi đọc câu hỏi của bạn, tôi đã kiểm tra trực tuyến để hiểu sự khác biệt vì vậy câu trả lời là tôi cần xác thực URI, chứ không phải URL. –

Trả lời

5
public static bool IsValidUri(string uriString) 
{ 
    Uri uri; 
    if (!uriString.Contains("://")) uriString = "http://" + uriString; 
    if (Uri.TryCreate(uriString, UriKind.RelativeOrAbsolute, out uri)) 
    { 
     if (Dns.GetHostAddresses(uri.DnsSafeHost).Length > 0) 
     { 
      return true; 
     } 
    } 
    return false; 
} 
+1

Giao thức có thể là [vài thứ khác] (http://en.wikipedia.org/wiki/Uniform_Resource_Identifier#Examples_of_absolute_URIs) ngoài HTTP. – slugster

+0

@slugster: Đó là lý do tại sao anh ta kiểm tra xem nó đã có giao thức chưa ... anh ta chỉ đặt nó thành http nếu nó không .. đó là điều phổ biến nhất và khá an toàn để mặc định. – mpen

+0

Cảm ơn bạn đã nhập mã. Tuy nhiên mã này xây dựng một Uri từ một từ duy nhất - nếu tôi vượt qua "google" tôi nhận được trong trở lại "http: // google /" mà không phải là những gì tôi cần. Ngoài ra tôi muốn tránh xây dựng logic mã trên các cấu trúc try/catch. –

15

Điều bạn đang tìm kiếm là Uri.IsWellFormedUriString. Các mã sau đây trả về true:

Uri.IsWellFormedUriString("google.com", UriKind.RelativeOrAbsolute) 

Nếu bạn đặt UriKind đến tuyệt đối, nó trả về false:

Uri.IsWellFormedUriString("google.com", UriKind.Absolute) 

EDIT: Xem here cho UriKind liệt kê.

  • RelativeOrAbsolute: Loại Uri không xác định.
  • Tuyệt đối: Uri là Uri tuyệt đối.
  • Tương đối: Uri là Uri tương đối.

Từ MSDN documentation:

Absolute URI được đặc trưng bởi một tài liệu tham khảo đầy đủ để tài nguyên (ví dụ: http://www.contoso.com/index.html), trong khi một Uri tương đối phụ thuộc vào một cơ sở định nghĩa trước URI (ví dụ: /index.html).

Ngoài ra, hãy xem here cho Uri.IsWellFormedUriString. Phương pháp này hoạt động theo RFC 2396 và RFC 2732.

Nếu bạn xem RFC 2396, bạn sẽ thấy google.com không phải là URI hợp lệ. Trên thực tế, www.google.com không phải là không. Nhưng dưới F. viết tắt URL, situtation này được giải thích một cách chi tiết như sau:

Cú pháp URL được thiết kế để tham khảo rõ ràng mạng nguồn lực và khả năng mở rộng thông qua thức truy cập URL.Tuy nhiên, khi URL nhận dạng và sử dụng đã trở nên phổ biến, phương tiện truyền thống truyền thống (truyền hình, radio, báo, biển quảng cáo, v.v.) ngày càng có nhiều tham chiếu URL viết tắt được sử dụng. Đó là, một tham chiếu bao gồm chỉ quyền và phần đường dẫn của tài nguyên đã xác định, chẳng hạn như là www.w3.org/Addressing/ hoặc đơn giản là tên máy chủ DNS. Các tham chiếu như vậy chủ yếu dành cho giải thích của con người chứ không phải là máy, với giả thiết giả định rằng dựa trên ngữ cảnh là đủ để hoàn thành URL (ví dụ: hầu hết tên máy chủ bắt đầu bằng "www" có thể có tiền tố URL của "http : // "). Mặc dù không có bộ tiêu chuẩn chẩn đoán để định hướng các tham chiếu URL viết tắt, nhiều khách hàng triển khai cho phép người dùng nhập và giải quyết bằng phương pháp heuristically. Cần lưu ý rằng các chẩn đoán như vậy có thể thay đổi theo thời gian, đặc biệt khi các lược đồ URL mới được giới thiệu. Vì URL viết tắt có cùng cú pháp với đường dẫn URL tương đối, nên không thể sử dụng tham chiếu URL viết tắt trong ngữ cảnh trong đó các URL tương đối được mong đợi. Điều này giới hạn việc sử dụng các URL viết tắt đến các địa điểm nơi không có URL cơ sở được xác định, chẳng hạn như hộp thoại và các quảng cáo ngoại tuyến .

Điều tôi hiểu từ đó là, Uri.IsWellFormedUriString chấp nhận các chuỗi dưới dạng www.abc.com làm URI hợp lệ. Nhưng google.com không được chấp nhận là một URI tuyệt đối trong khi nó được chấp nhận như là một URI tương đối bởi vì nó tuân theo đặc tả đường dẫn tương đối (các đường dẫn có thể chứa.).

Ngoài ra, như một lưu ý phụ, nếu bạn muốn sử dụng cụm từ thông dụng để phân tích URI, bạn có thể đọc B. Phân tích tham chiếu URI bằng Cụm từ thông dụng.

+0

cảm ơn bạn đã trả lời. Phương pháp này là thú vị, nó xác nhận "google.com" là rất tốt, tuy nhiên nó xác nhận một từ duy nhất ("google") như một uri cũng được hình thành, mà tôi không cần. Câu trả lời hữu ích dù sao –

+0

@Andrei: Tôi đã cập nhật câu trả lời của mình. Câu trả lời nằm trong RFC 2396. – Zafer

+0

Cảm ơn vì điều này, tôi đã đọc thêm về Uri.IsWellFormedUriString và tôi nghĩ rằng tôi hiểu tại sao nó xác nhận "google" là một Uri hợp lệ. Vì vậy, những gì tôi cần tôi đoán, là một cách để kiểm tra xem kết thúc của chuỗi có một .com, .net, ..etc gắn liền với nó. Tôi miễn cưỡng sử dụng Exp thường xuyên về điều này bởi vì họ có thể có sai sót, nếu trong tương lai ai đó phát minh ra một phần mở rộng phổ biến như ".zedo", ví dụ, regExp của tôi sẽ không bắt được nó vì nó sẽ chỉ xử lý các chấm dứt đã biết (.net, .com, v.v.) –

2

sử dụng RegExp cho việc này.

Mẫu mã của URL validation

Regex RgxUrl = new Regex("(([a-zA-Z][0-9a-zA-Z+\\-\\.]*:)?/{0,2}[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?(#[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?"); 
    if (RgxUrl.IsMatch(<yourURLparameter>)) 
    { 
     //url is valid 
    } 
    else 
    { 
     //url is not valid 
    } 
3

đây là một biến thể của mã từ Jojaba mà tôi cám ơn sự kiểm tra DNS, đó là những gì tôi cần. vấn đề duy nhất là nó sử dụng một thử bắt trong logic của nó mà tôi đã hy vọng để tránh.

 public static Uri StringToAbsoluteUri(string uriString) 
     { 
     Uri resultUri = null; 

     if (!uriString.Contains(Uri.SchemeDelimiter)) 
      uriString = Uri.UriSchemeHttp + Uri.SchemeDelimiter + uriString; 

     if (Uri.TryCreate(uriString, UriKind.RelativeOrAbsolute, out resultUri)) 
     { 
      try 
      { 
       IPAddress[] addressesOfHost = Dns.GetHostAddresses(resultUri.DnsSafeHost); 
       if (addressesOfHost.Length > 0) 
       { 
        return resultUri; 
       } 
      } 
      catch (System.Net.Sockets.SocketException) 
      { 
       return null; 
      } 
     } 
     return resultUri; 
     } 
Các vấn đề liên quan