Uri
からの自動エスケープがどのように機能するかを確認する簡単なテストを行いました。文字が文字が自動的に System.Uri.ToStringが一部の文字をエンコードしていない
で変更されません自動的に
- :私は、次の行動を観察しました。上記のオプションの1つが適用される時期を決定するルールは何ですか?
var uri = new Uri("http://a? "); Assert.True(uri.IsWellFormedOriginalString()); // Uri ignores the blank Assert.AreEqual("?", uri.Query); // Uri trims the blank Assert.AreEqual("http://a/?", uri.ToString()); // Again Uri trims the blank Assert.AreEqual("http://a/?", uri.AbsoluteUri); // Same uri = new Uri("http://a? %"); Assert.False(uri.IsWellFormedOriginalString()); // Uri knows that something is unescaped Assert.AreEqual("?%20%25", uri.Query); // Uri replaces " " with %20 Assert.AreEqual("http://a/? %25", uri.ToString()); // Uri leaves the unencoded " " but encodes "%" Assert.AreEqual("http://a/?%20%25", uri.AbsoluteUri); // Correct but not RFC 3986 (would require +%25)
私はそれが
Uri.ToString
の代わりにUri.AbsoluteUri
を使用するのが最善だと思うが、それは相対URIのためのダミースキームと権限が必要です。もう1つの解決策は、クエリ文字列をパラメータで解析し、パラメータ名と値にWebUtility.UrlEncode
を使用して残りをUri
に渡すことです。
残念ながら、私はこれらの仕様に精通していません。なぜそれはすべての特殊文字をエスケープしないのですか?これらの例外の理由は何ですか?また、ToStringドキュメントでは、最初の 'ToString'の例のように、エンコードされていない文字も削除される可能性があるとは言及していません。 – user764754
仕様がなぜこのように設計されたのか分かりません。欠落しているエスケープされていないクエリについては、URLの末尾にスペースがどの程度有効かわかりません。 .NETのように見えるので、それらをトリミングしてエンコードする必要があります。後に文字を追加すると、その文字が安全であるかどうかにかかわらず、スペースはもはや末尾スペースではないため、エンコードする必要があります。 – keyboardP
もう1つのことは、 'ToString'ドキュメントでは'? 'はエスケープされていると言われていますが、' http:// a ?? 'は'? 'が特別でないchar。 – user764754