อะไรคือความแตกต่างระหว่าง Uri ToString () และ Uri.AbsoluteUri?


92

ในฐานะที่เป็นความคิดเห็นของคำถาม Azure ในตอนนี้ @smarx ตั้งข้อสังเกต

ฉันคิดว่าโดยทั่วไปแล้วการทำ blob.Uri.AbsoluteUri จะดีกว่า blob.Uri ToString ()

มีเหตุผลสำหรับเรื่องนี้หรือไม่? เอกสารประกอบสำหรับUri.AbsoluteUriบันทึกว่า "Gets the absolute URI", Uri.ToString()"Gets a canonical string representation for the specific instance"


1
ToString ทำให้ URI อ่านง่ายขึ้น แต่ในขณะที่ทำเช่นนั้นจะถอดรหัสอักขระที่เข้ารหัส URLE จำนวนมากซึ่งจะเป็นปัญหาในบางกรณี พฤติกรรมยังแตกต่างกันระหว่างรันไทม์ของ. net framework ดูdhvik.blogspot.com/2019/12/…เพื่อเปรียบเทียบ
แดน

คำตอบ:


103

ยกตัวอย่างเช่น:

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

ในกรณีนี้ Uri.ToString()จะส่งคืน URL ที่มนุษย์อ่านได้: http: // somehost / somepath? somekey = some + value

Uri.AbsoluteUri ในทางกลับกันจะส่งคืนรูปแบบที่เข้ารหัสเป็น HttpUtility.UrlEncode ส่งคืน: http://somehost/somepath?somekey=some%2bvalue


35
แต่ทราบว่า "URL มนุษย์สามารถอ่านได้" (กลับมาจาก ToString) อาจเป็นความเสียหายและแทบจะไม่เคยสิ่งที่คุณต้องการ: code.logos.com/blog/2010/08/uritostring_must_die.html ฉันจะหลีกเลี่ยงการโทร ToString ทุกครั้งที่ทำได้
Bradley Grainger

1
มีหลายครั้งที่คุณต้องการ ToString นี่คือตัวอย่างที่ดีใน SO (ดูคำตอบของฉันด้านบน) คุณต้องการ "แสดงภาพ" URL ประเด็น (เสมอในการเขียนโปรแกรม) คือ - ระวังและรู้ว่าคุณกำลังทำอะไร
Ofer Zelig

3
โปรดทราบว่าตัวอย่างที่นี่ (และในcode.logos.com/blog/2010/08/uritostring_must_die.html ) ไม่เป็นปัจจุบันอีกต่อไป ปัญหาเหล่านี้ได้รับการแก้ไขแล้วใน. NET Framework 4.5 อย่างไรก็ตาม ToString () ยังคงมีไว้สำหรับการแสดง URL ที่อ่านได้ (ภาพ) ของมนุษย์เท่านั้น หากคุณคัดลอก URL นี้ไปยังเบราว์เซอร์ก็ยังควรใช้งานได้
arni

1
ดูน่าใช้OriginialStringกว่าToString()[ docs.microsoft.com/en-us/dotnet/api/…
karsnen

31

นอกจากนี้:หากคุณUriเป็นญาติ Uri AbsoluteUriจะล้มเหลวToString()ไม่ใช่

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

5

เนื่องจากทุกคนดูเหมือนจะคิดว่าuri.AbsoluteUriดีกว่า แต่เนื่องจากมันล้มเหลวด้วยเส้นทางสัมพัทธ์ดังนั้นวิธีสากลอาจเป็น:

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


0

ตัวอย่างต่อไปนี้เขียนเนื้อหาทั้งหมดของอินสแตนซ์ Uri ไปยังคอนโซล ในตัวอย่างที่แสดง

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

ถูกเขียนลงในคอนโซล

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

คุณสมบัติ AbsoluteUri ประกอบด้วย URI ทั้งหมดที่เก็บไว้ในอินสแตนซ์ Uri รวมถึงส่วนย่อยและสตริงการสืบค้นทั้งหมด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.