2017-05-04 1 views
6

.Net 4.5 이전에는 System.Uri가 인코딩 된 슬래시를 인코딩 해제하는 것으로 보였으 나 이후에는 수정되었습니다. 참조 : https://stackoverflow.com/a/20733619/188740System.Uri 및 인코딩 된 콜론 (:)

콜론과 동일한 문제가 발생합니다. System.Uri은 여전히 ​​인코딩 된 콜론을 암호화 해제합니다. 예 : %3A가 선택 System.Uri에 의해 :로 다시 전환되는 방식

 var uri = new Uri("http://www.example.com/?foo=http%3A%2F%2Fwww.example.com"); 
     var s = uri.ToString(); //http://www.example.com/?foo=http:%2F%2Fwww.example.com 

알 수 있습니다. 이거 버그 야? 가장 좋은 해결 방법은 무엇입니까?

답변

4

대신 Uri.AbsoluteUri을 사용하는 것이 어떻습니까? 이 .AbsoluteUri 반면 hereimplementation 훨씬 간단을 가지고 볼 수있는 특정 부분을 언 이스케이프하는 논리가 같은

var s = uri.AbsoluteUri; 
// http://www.example.com/?foo=http%3A%2F%2Fwww.example.com 

는 소스에 따라 경찰, uri.ToString() 보인다.

Uri.ToString() System.Uri.ToString()에 대한 MSDN 설명서 당으로

: 열린 인스턴스의 이스케이프 정규 표현을 포함

String 인스턴스. #,? 및 %를 제외한 모든 문자는 이스케이프 처리되지 않습니다. 예 당 몇 문자열을 시도 이후로 실제 구현이 somwhat 같은처럼

는 그러나

%3A (:) // gets unescaped 
%20 () // gets unescaped 
%2A (*) // gets unescaped 

%2b, %26, %23, %24, %25 (+, &, #, $, %) // Remain as-is (escaped) 

기타 링크 '*spaces는 이스케이프 있습니다 만 :'보인다

+0

AbsoluteUri는 매력처럼 작동합니다. 콜론이 AbsoluteUri없이 인코딩되지 않은 이유는 무엇입니까? 나 한테 버그 같아. –

+1

네, 그렇게 보입니다. 나는 그 오류가 어딘가에 있다고 믿는다. (http://referencesource.microsoft.com/#System/net/System/URI.cs,1675). '.AbsoluteUri'는 훨씬 간단한 [구현] (http://referencesource.microsoft.com/#System/net/System/URI.cs,738)을 가지고 있습니다. – degant