Apa perbedaan antara Uri.ToString () dan Uri.AbsoluteUri?

92

Sebagai komentar untuk pertanyaan Azure barusan, @smarx mencatat

Menurut saya biasanya lebih baik melakukan blob.Uri.AbsoluteUri daripada blob.Uri.ToString ().

Apakah ada alasan untuk ini? Dokumentasi untuk Uri.AbsoluteUricatatan bahwa "Mendapat URI absolut", Uri.ToString()"Mendapat representasi string kanonis untuk instance yang ditentukan".

Jeremy McGee
sumber
1
ToString memang membuat URI lebih mudah dibaca, tetapi saat melakukannya, ToString menerjemahkan banyak karakter yang dikodekan URLE yang akan merepotkan dalam beberapa kasus. Perilaku ini juga berbeda antara waktu proses kerangka kerja .net. Lihat dhvik.blogspot.com/2019/12/… untuk perbandingan.
Dan

Jawaban:

103

Diberikan misalnya:

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

Dalam kasus ini, Uri.ToString()akan mengembalikan URL yang dapat dibaca manusia: http: // somehost / somepath? Somekey = some + value

Uri.AbsoluteUri di sisi lain akan mengembalikan bentuk yang dikodekan sebagai HttpUtility.UrlEncode mengembalikannya: http://somehost/somepath?somekey=some%2bvalue

Ofer Zelig
sumber
35
Namun perhatikan bahwa "URL yang dapat dibaca manusia" (dikembalikan dari ToString) mungkin rusak dan hampir tidak pernah sesuai dengan keinginan Anda: code.logos.com/blog/2010/08/uritostring_must_die.html . Saya akan menghindari memanggil ToString bila memungkinkan.
Bradley Grainger
1
Ada kalanya Anda menginginkan ToString. Di sini, di SO adalah contoh yang bagus (Lihat jawaban saya di atas). Anda ingin "memvisualisasikan" URL. Intinya (selalu dalam pemrograman) adalah - berhati-hatilah, dan ketahui apa yang Anda lakukan.
Ofer Zelig
3
Perhatikan bahwa contoh di sini (dan di code.logos.com/blog/2010/08/uritostring_must_die.html ) tidak lagi terkini. Masalah ini telah diperbaiki di .NETFramework 4.5. Namun, ToString () masih hanya dimaksudkan untuk representasi URL yang dapat dibaca manusia (visual). Jika Anda menyalin URL ini ke browser, itu masih berfungsi.
arni
1
Sepertinya ini yang terbaik untuk digunakan OriginialStringdaripada ToString()[ docs.microsoft.com/en-us/dotnet/api/…
karsnen
31

Selain itu: Jika Anda Uriadalah kerabat Anda Uri AbsoluteUri akan gagal, ToString()bukan.

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

Karena semua orang tampaknya berpikir itu uri.AbsoluteUrilebih baik, tetapi karena gagal dengan jalur relatif, maka mungkin cara universal adalah:

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

Mengapa tidak memeriksa dan menggunakan yang benar?

string GetUrl(Uri uri) => uri?.IsAbsoluteUri == true ? uri?.AbsoluteUri : uri?.ToString();
Rohit Vipin Mathews
sumber
0

Contoh berikut menulis konten lengkap dari instance Uri ke konsol. Dalam contoh yang ditunjukkan,

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

ditulis ke konsol.

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

Properti AbsoluteUri menyertakan seluruh URI yang disimpan dalam instance Uri, termasuk semua fragmen dan string kueri.

AKMDD Ken
sumber