Uri.ToString () ve Uri.AbsoluteUri arasındaki fark nedir?


92

Az önce bir Azure sorusuna yorum olarak @smarx şunları kaydetti:

Genelde blob.Uri.AbsoluteUri yapmanın blob.Uri.ToString () yapmaktan daha iyi olduğunu düşünüyorum.

Bunun bir sebebi var mı? Belgeler Uri.AbsoluteUri, Uri.ToString()" Mutlak URI'yi alır", "Belirtilen örnek için kurallı bir dize temsilini alır."


1
ToString, URI'yi daha okunaklı hale getirir, ancak bunu yaparken, bazı durumlarda sorun yaratacak olan birçok URLE kodlu karakterin kodunu çözer. Davranış, .net çerçevesinin çalışma zamanları arasında da farklıdır. Karşılaştırma için dhvik.blogspot.com/2019/12/… bakın .
Dan

Yanıtlar:


103

Örneğin verilen:

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

Bu durumda, Uri.ToString()insan tarafından okunabilir bir URL döndürür: http: // somehost / somepath? Somekey = some + value

Uri.AbsoluteUri Öte yandan kodlanmış formu HttpUtility.UrlEncode döndürür: http://somehost/somepath?somekey=some%2bvalue


35
Ancak "insan tarafından okunabilen URL" nin (ToString'den döndürülen) muhtemelen bozuk olduğunu ve neredeyse hiçbir zaman istediğinizi olmadığını unutmayın: code.logos.com/blog/2010/08/uritostring_must_die.html . Mümkün olduğunda ToString'i çağırmaktan kaçınırdım.
Bradley Grainger

1
ToString'i istediğiniz zamanlar vardır. Burada SO'da harika bir örnek var (Yukarıdaki cevabıma bakın). URL'yi "görselleştirmek" istiyorsunuz. Önemli olan (her zaman programlamada) - dikkatli olun ve ne yaptığınızı bilin.
Ofer Zelig

3
Buradaki örneğin (ve code.logos.com/blog/2010/08/uritostring_must_die.html ) artık güncel olmadığını unutmayın. Bu sorunlar .NET Framework 4.5'te düzeltilmiştir. Ancak, ToString () hala yalnızca URL'nin insan tarafından okunabilir (görsel) temsili içindir. Bu URL'yi tarayıcıya kopyalarsanız, yine de çalışmalıdır.
arni

2
Görünüşe OriginialStringgöre ToString()[ docs.microsoft.com/en-us/dotnet/api/…
karsnen

31

Ayrıca: Eğer senin Uribir akraba Uri AbsoluteUri , başarısız olur ToString()değil.

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

5

Herkes bunun uri.AbsoluteUridaha iyi olduğunu düşündüğü için , ancak göreceli yollarla başarısız olduğu için, muhtemelen evrensel yol şöyle olacaktır:

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

5

Neden doğru olanı kontrol edip kullanmıyorsunuz?

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

0

Aşağıdaki örnek, Uri örneğinin tüm içeriğini konsola yazar. Gösterilen örnekte,

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

konsola yazılır.

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

AbsoluteUri özelliği, tüm parçalar ve sorgu dizeleri dahil Uri örneğinde depolanan tüm URI'yi içerir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.