Uri.ToString ()과 Uri.AbsoluteUri의 차이점은 무엇입니까?


92

방금 Azure 질문에 대한 의견으로 @smarx가 언급했습니다.

일반적으로 blob.Uri.ToString ()보다 blob.Uri.AbsoluteUri를 수행하는 것이 더 낫다고 생각합니다.

이것에 대한 이유가 있습니까? Uri.AbsoluteUri"절대 URI를 가져옵니다", Uri.ToString()"지정된 인스턴스에 대한 표준 문자열 표현을 가져 옵니다"라는 메모에 대한 문서입니다 .


1
ToString은 URI를 더 읽기 쉽게 만들지 만 그렇게하는 동안 많은 URLEncoded 문자를 디코딩하여 경우에 따라 문제가 될 수 있습니다. .net 프레임 워크의 런타임 간에도 동작이 다릅니다. 비교는 dhvik.blogspot.com/2019/12/… 를 참조하십시오 .
Dan

답변:


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 2012 년

1
ToString을 원할 때가 있습니다. 여기에 좋은 예가 있습니다 (위의 대답 참조). URL을 "시각화"하려고합니다. 요점은 (항상 프로그래밍에서)-조심하고 무엇을하고 있는지 아는 것입니다.
Ofer Zelig

3
여기에있는 예제 (및 code.logos.com/blog/2010/08/uritostring_must_die.html )는 더 이상 최신이 아닙니다. 이러한 문제는 .NET Framework 4.5에서 수정되었습니다. 그러나 ToString ()은 여전히 ​​사람이 읽을 수있는 (시각적) URL 표현만을 의미합니다. 이 URL을 브라우저에 복사해도 여전히 작동합니다.
arni

1
[ docs.microsoft.com/en-us/dotnet/api/…OriginialStringToString()
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());

5

올바른 것을 확인하고 사용하지 않으시겠습니까?

string GetUrl(Uri uri) => uri?.IsAbsoluteUri == true ? uri?.AbsoluteUri : 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.