2017-05-04 57 views
6

Przed .Net 4.5 wygląda na to, że System.Uri zakodowałby zakodowane ukośniki, ale zostało to już naprawione. Numer referencyjny: https://stackoverflow.com/a/20733619/188740System.Uri i kodowany dwukropek (:)

Z tym samym problemem napotykam dwukropki. System.Uri nadal nie koduje kodowane dwukropki. Przykład:

 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 

Wskazówki jak %3A zostanie przełączony do : przez System.Uri. Czy to błąd? Jakie jest najlepsze obejście tego problemu?

Odpowiedz

4

Zamiast tego zamiast korzystać z Uri.AbsoluteUri?

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

Według źródła, uri.ToString() wygląda to ma logiki do unescape pewne części, które mogą być postrzegane here natomiast .AbsoluteUri ma znacznie prostszy implementation.

Uri.ToString()

Zgodnie dokumentacji MSDN System.Uri.ToString():

Instancja łańcuch, który zawiera Niecytowany kanoniczną reprezentację przykładu URI. Wszystkie znaki są usuwane z pustej litery oprócz #,? I%.

Jednak, jak na przykład i po wypróbowaniu kilku więcej ciągów, wygląda rzeczywista realizacja jest somwhat jak „Tylko :, * i spaces są Niecytowany”

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

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

Inne Linki

+0

AbsoluteUri działa jak urok. Dlaczego dwukropki są niekodowane bez AbsoluteUri? Wygląda mi na błąd. –

+1

Tak to wygląda. Wierzę, że błąd jest gdzieś [tutaj] (http://referencesource.microsoft.com/#System/net/System/URI.cs,1675), który rozwija się i unescapes niektóre części. Natomiast ".AbsoluteUri' ma znacznie prostszą [implementację] (http://referencesource.microsoft.com/#System/net/System/URI.cs,738). – degant