背景: MVC アプリケーションの URL 操作をしようとしています。クエリ文字列値を別の値に置き換える HtmlHelper 拡張メソッドを作成しました。このメソッドは現在のリクエスト文字列を取得し、(Foo=1&Foo=Hello%2c%20World!&Foo=2 が Foo=1,Hello, World,2 として読み取られるのを防ぐために) クエリ部分を手動で分割してから、 UriBuilder と Uri を使用して URL を取得します。
問題: 何らかの理由で、Uri.ToString がクエリ文字列を部分的にデコードします。簡単なテストとして、LINQPad を起動して以下を実行しました。
var ub = new System.UriBuilder("http://foobar");
ub.Query = "NY%26A"; // NY&A
ub.Uri.Dump();
ub.Uri.ToString().Dump();
ub.Uri.Query.Dump();
ub.ToString().Dump();
結果は次のとおりです。
http://foobar/?NY&A
http://foobar/?NY&A
?NY%26A
http://foobar:80/?NY%26A
部分的にデコードすると言います。これは、多くのエスケープ文字を使用すると、一部がデコードされ、残りがそのままになるためです。
var ub = new System.UriBuilder("http://foobar");
ub.Query = "!%40%23%24%25%5E%26*()"; // !@#$%^&*()
ub.Uri.Dump();
ub.Uri.ToString().Dump();
ub.Uri.Query.Dump();
ub.ToString().Dump();
そして結果:
http://foobar/?!@%23$%25^&*()
http://foobar/?!@%23$%25^&*()
?!%40%23%24%25%5E%26*()
http://foobar:80/?!%40%23%24%25%5E%26*()
質問: 誰かが何が起こっているのか説明できますか?