2011-09-05 6 views
7

からすべてのパラメータが、私は以下の文字列からURIオブジェクトを作成するとしますurldecodes:が自動的に渡された文字列

string url = @"http://someserver.com?param1=1&url=http%3a%2f%2fwww.otherserver.com"; 
Uri uri = new Uri(url, UriKind.Absolute); 

期待される結果は次のようになります。

取得
http://someserver.com?param1=1&url=http%3a%2f%2fwww.otherserver.com 

:同じ動作がウリの作成を許可する多くの関連する方法に気づいている

http://someserver.com/?param1=1&url=http://www.otherserver.com 

:Uri.TryCreateを、 UriBuilder.Uriなど

初期エンコードされたパラメータを保持するUriはどのようにして取得できますか?

+0

何をしたのが期待されますか?あなたがコンソールアプリケーション 'Console.WriteLine(uri.AbsoluteUri);であなたのコードを試してみたら、エンコードされたURL –

+1

を返します。実際には文字列をデコードするToString()メソッドです。 .OriginalStringまたは.AbsoluteUriは、エンコードされた文字列を返します。相対URLの場合は、.PathAndQueryを使用してください。 – jishi

答えて

3

この動作はdocumentedです:

いくつかのスキームのコンストラクタでの正規化の一環として、 は表現が圧縮され脱出しました。 URIが コンパクトなエスケープシーケンスになるスキームには、file、http、https、 、net.pipe、およびnet.tcpが含まれます。他のすべてのスキームでは、エスケープされたシーケンスは圧縮されていない です。たとえば、2つのドット "%"をパーセントでエンコードして "%2E%2E"とすると、URIコンストラクタはいくつかの スキームに対してこのシーケンスを圧縮します。たとえば、次のコードサンプルは、httpスキームのURI コンストラクターを示しています。

ので1この問題を回避するには、URLオブジェクトを構築するためにカスタムスキーム(例えばleavemealone://)を使用して、一時的かもしれません(おそらくUriBuilderて?)。私の場合は

4

URLをどのように取得しましたか? Visual Studioでマウスの上にマウスを置くと、デコードされたURLが実際に表示されます。

しかし、AbsoluteUriプロパティでアクセスするたびに、エンコードされたURLが表示されます。

+0

よく観察された動作について説明しています。それはasp.netのmvcアプリですが、それは問題ではありません。 –

+0

私は何を尋ねなかった、私はどのように尋ねた。 – CodeCaster

+0

申し訳ございません。私はasp.netのmvcルーティングを使用して形成しましたが、私はそれをいくつかのtweeksを作る必要があります。 –

0

私の代わりに、同じクラスのURIプロパティを使用してのUriBuilderクラスのToStringメソッド()メソッドを返すことで、それを解決しました。

4

.NET4では、特定のスキームvia a configurationのURIの圧縮を無効にすることができます

<configuration> 
    <uri> 
    <schemeSettings> 
     <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes"/> 
    </schemeSettings> 
    </uri> 
</configuration> 

注意をデフォルトの動作を無効に関連するセキュリティ上の問題があること。

関連する問題