2017-05-04 17 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を使用してみませんか?ソース1として

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

それは.AbsoluteUriimplementationはるかに簡単であるのに対しhereを見ることができる特定の部分をエスケープ解除するロジックを有するように、uri.ToString()が見えます。

Uri.ToString()

System.Uri.ToString()ためのMSDNドキュメントあたりとして:Uriインスタンスのエスケープ正規表現を含む

A Stringインスタンス。 #、?、%以外のすべての文字はエスケープされません。 「のみ:*spacesがエスケープされている」

実際の実装は、ようsomwhatあるようしかし例につき、いくつかの複数の文字列を試した後のように、それが見えます

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

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

その他のリンク

+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

関連する問題