2012-08-14 29 views
7

Trong các thử nghiệm sau đây, tại sao (chỉ) cái cuối cùng không thành công?Uri.IsWellFormedUriString cho tương đối Hashbang url tương thích

[Fact] 
    public void IsWellFormedUriString_AbsolutNonHashTagUri_ReturnsTrue() 
    { 
     Assert.True(Uri.IsWellFormedUriString("http://www.RegularSite.org/Home", UriKind.Absolute)); 
    } 

    [Fact] 
    public void IsWellFormedUriString_RelativeNonHashTagUri_ReturnsTrue() 
    { 
     Assert.True(Uri.IsWellFormedUriString("Home", UriKind.Relative)); 
    } 

    [Fact] 
    public void IsWellFormedUriString_AbsolutHashTagUri_ReturnsTrue() 
    { 
     Assert.True(Uri.IsWellFormedUriString("http://www.w3.org/#!Home", UriKind.Absolute)); 
    } 

    [Fact] 
    public void IsWellFormedUriString_RelativeHashTagUri_ReturnsTrue() 
    { 
     // Fails! 
     Assert.True(Uri.IsWellFormedUriString("#!Home", UriKind.Relative)); 
    } 

Nếu Uri nhận Hashbangs trong phiên bản tuyệt đối của IsWellFormedUriString, tại sao không có trong phiên bản tương đối? Tôi đang thiếu gì?

Lưu ý: This không có tác dụng.

Trả lời

3

Lý do điều này không hoạt động như bạn mong đợi là vì băm không phải là một phần của URI Scheme. Phương thức này đang chờ phần phân cấp của định dạng URI và một dấu băm (và sau đó là một hashbang) không phải là thành viên của phần phân cấp mà từ đó một đường dẫn tương đối và tuyệt đối được xác định.

<> là một phần bắt buộc
[] là một phần bắt buộc

<scheme name> : <hierarchical part> [ ? <query> ] [ # <fragment> ]

như một ví dụ về một URI tuyệt đối; truy vấn, nếu tôi không nhầm được bỏ qua, trong đó bao gồm các mảnh vỡ và băm dấu

http://domain.com/path/to/something/?query=1#fragment

Dưới đây là một số thông tin cho bạn là tốt. Đây là tất cả từ MSDN mô tả phương pháp Uri.IsWellFormedUriString()

Cho biết chuỗi được tốt được hình thành bằng cách cố gắng để xây dựng một URI với chuỗi và đảm bảo rằng các chuỗi không đòi hỏi hơn nữa trốn thoát.

Ghi chú:

Theo mặc định, các chuỗi được coi là tốt được hình thành theo RFC 2396RFC 2732. Nếu tính năng phân định tài nguyên quốc tế (IRI) hoặc phân tích tên miền quốc tế (IDN) được kích hoạt, chuỗi được xem là được định dạng phù hợp với RFC 3986RFC 3987.

Chuỗi được coi là kém hình thành, gây phương pháp để trở về sai sự thật, nếu một trong các điều kiện sau đây xảy ra

Sau đây là một số ví dụ thất bại:

http://www.contoso.com/path???/file tên
Chuỗi không trốn thoát một cách chính xác .

c: \ directory \ filename
Chuỗi là Uri tuyệt đối đại diện cho tệp URI ngầm định.

tệp: // c:/directory/filename
Chuỗi là một URI tuyệt đối thiếu dấu gạch chéo trước đường dẫn.

http: \ host/path/tập tin
Chuỗi chứa backslashes unescaped ngay cả khi họ sẽ được coi như dấu gạch chéo

www.contoso.com/path/file
Chuỗi đại diện cho một tuyệt đối Uri thứ bậc và không chứa ": //"

+0

Cảm ơn câu trả lời chi tiết, nhưng theo nó - thử nghiệm thứ ba sẽ thất bại và không. Điều này không trả lời câu hỏi của tôi. – seldary

+0

@seldary Không, thử nghiệm thứ ba sẽ chuyển vì bạn có 'http: // www.w3.org /' như là một Uri tuyệt đối đủ để nó vượt qua vì nó phát hiện '#' là sự bắt đầu của một đoạn và '! Home' như đoạn văn bản, do đó nó đi qua. – vane

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