Sự khác biệt giữa Uri.ToString () và Uri.AbsoluteUri là gì?


92

Như một nhận xét cho câu hỏi Azure vừa rồi, @smarx đã lưu ý

Tôi nghĩ nói chung tốt hơn nên làm blob.Uri.AbsoluteUri hơn là blob.Uri.ToString ().

Có một lý do cho điều này? Tài liệu cho Uri.AbsoluteUrilưu ý rằng nó "Nhận URI tuyệt đối", Uri.ToString()"Nhận biểu diễn chuỗi chuẩn cho phiên bản được chỉ định."


1
ToString làm cho URI dễ đọc hơn nhưng trong khi làm như vậy, nó giải mã nhiều ký tự URLEncoded, điều này sẽ gây rắc rối trong một số trường hợp. Hành vi cũng khác nhau giữa các thời gian chạy của khung .net. Xem dhvik.blogspot.com/2019/12/… để so sánh.
— Dan

Câu trả lời:


103

Ví dụ:

UriBuilder builder = new UriBuilder("http://somehost/somepath");
builder.Query = "somekey=" + HttpUtility.UrlEncode("some+value");
Uri someUri = builder.Uri;

Trong trường hợp này, Uri.ToString()sẽ trả về một URL mà con người có thể đọc được: http: // somehost / somepath? Somekey = some + value

Uri.AbsoluteUri mặt khác sẽ trả về biểu mẫu được mã hóa như HttpUtility.UrlEncode đã trả về: http://somehost/somepath?somekey=some%2bvalue


35
Nhưng lưu ý rằng "URL có thể đọc được của con người" (được trả về từ ToString) có thể bị hỏng và hầu như không bao giờ là thứ bạn muốn: code.logos.com/blog/2010/08/uritostring_must_die.html . Tôi sẽ tránh gọi ToString bất cứ khi nào có thể.
— Bradley Grainger

1
Có những lúc bạn muốn ToString. Đây trong SO là một ví dụ tuyệt vời (Xem câu trả lời của tôi ở trên). Bạn muốn "trực quan hóa" URL. Vấn đề (luôn luôn trong lập trình) là - hãy cẩn thận và biết bạn đang làm gì.
— Ofer Zelig

3
Lưu ý rằng ví dụ ở đây (và trong code.logos.com/blog/2010/08/uritostring_must_die.html ) không còn mới nữa. Các sự cố này đã được khắc phục trong .NET Framework 4.5. Tuy nhiên, ToString () vẫn chỉ có nghĩa là con người có thể đọc được (trực quan) của URL. Nếu bạn sao chép URL này vào trình duyệt, nó sẽ vẫn hoạt động.
— arni

1
Có vẻ như tốt nhất là sử dụng OriginialStringhơn ToString()[ docs.microsoft.com/en-us/dotnet/api/…
— karsnen

31

Ngoài ra: Nếu bạn Urilà người thân của Uri AbsoluteUri bạn sẽ thất bại, ToString()không.

Uri uri = new Uri("fuu/bar.xyz", UriKind.Relative);
string str1 = uri.ToString(); // "fuu/bar.xyz"
string str2 = uri.AbsoluteUri; // InvalidOperationException

5

Vì mọi người dường như nghĩ rằng điều đó uri.AbsoluteUritốt hơn, nhưng vì nó không thành công với các đường dẫn tương đối, nên có lẽ cách phổ biến sẽ là:

Uri uri = new Uri("fuu/bar.xyz", UriKind.Relative);
string notCorruptUri = Uri.EscapeUriString(uri.ToString());

5

Tại sao không kiểm tra và sử dụng một trong những chính xác?

string GetUrl(Uri uri) => uri?.IsAbsoluteUri == true ? uri?.AbsoluteUri : uri?.ToString();

0

Ví dụ sau ghi toàn bộ nội dung của cá thể Uri vào bảng điều khiển. Trong ví dụ được hiển thị,

http://www.cartechnewz.com/catalog/shownew.htm?date=today

được ghi vào bảng điều khiển.

Uri baseUri = new Uri("http://www.cartechnewz.com");
Uri myUri = new Uri(baseUri, "catalog/shownew.htm?date=today");
Console.WriteLine(myUri.AbsoluteUri);

Thuộc tính AbsoluteUri bao gồm toàn bộ URI được lưu trữ trong cá thể Uri, bao gồm tất cả các đoạn và chuỗi truy vấn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.