2016-04-05 5 views
1

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に渡すことです。

  • 答えて

    3

    出力はデザインごとに予想されます。 Uri.ToStringためMSDN(強調鉱山)によれば

    Uriインスタンスのエスケープ正規表現 を含む文字列インスタンス。すべての文字はエスケープされません#、?、および%を除く。

    MSDNUri.Query(強調鉱山)のために:

    クエリ情報は、デフォルトによってRFC 2396によればを免れています。 国際資源識別子(IRIは)または国際化ドメイン 名(IDN)の解析が有効になっている場合は、クエリ情報がエスケープされ は、RFC 3986およびRFC 3987.

    に従ってについて、これらの順序は詳細がありますUri pageのセクションで変更が行われます。

    +0

    残念ながら、私はこれらの仕様に精通していません。なぜそれはすべての特殊文字をエスケープしないのですか?これらの例外の理由は何ですか?また、ToStringドキュメントでは、最初の 'ToString'の例のように、エンコードされていない文字も削除される可能性があるとは言及していません。 – user764754

    +0

    仕様がなぜこのように設計されたのか分かりません。欠落しているエスケープされていないクエリについては、URLの末尾にスペースがどの程度有効かわかりません。 .NETのように見えるので、それらをトリミングしてエンコードする必要があります。後に文字を追加すると、その文字が安全であるかどうかにかかわらず、スペースはもはや末尾スペースではないため、エンコードする必要があります。 – keyboardP

    +0

    もう1つのことは、 'ToString'ドキュメントでは'? 'はエスケープされていると言われていますが、' http:// a ?? 'は'? 'が特別でないchar。 – user764754