2011-01-12 26 views
1

私はHttpListenerを使用してリクエストを処理する単純なサーバーを構築しています。私がそれに送るクエリ文字列パラメータは、必要に応じてURLエンコードされます。たとえば、漢字ストリング"尺八"を送信する場合、エンコードは"%E5%B0%BA%E5%85%AB"です。HttpListenerRequestでUrlエンコーディングを処理する方法は?

私のサンプルのURLは、"/?q=%E5%B0%BA%E5%85%AB"です。私のコンテキストコールバックで

、私が持っている:

HttpListenerContext context = Listener.EndGetContext(); 
string rawUrl = context.Request.RawUrl; 
string query = context.Request.QueryString["q"]; 

は、結果の確認、私が取得:

rawUrl = "/?q=%E5%B0%BA%E5%85%AB" 
query = "尺八" 

しかし、私はcontext.Request.Urlを見れば、私は{http://localhost:8080/?q=尺八}を取得します。

context.Request.QueryStringのクエリ文字列が、UTF-8以外のエンコードを使用してデコードされているようです。

私の問題を回避するには、context.Request.QueryStringを無視して、これを行うことによって、自分自身を作成することです:私は正しい値を与える

var queryString = HttpUtility.ParseQueryString(context.Request.Url.Query); 

を、それはハックのようなもののように思えます。

HttpListener(またはコンテキスト、または要求)に、クエリ文字列をUTF-8と解釈する方法はありますか?それはとにかく標準だと思いますか?または、私はこの回避策で暮らすべきですか?

+1

あなたは確かに素晴らしいクエリ文字列を持っています:D –

+0

Downvoter?説明的なコメントを提供するのが通例です。 –

答えて

2

コードを見ると、ContentEncodingはUTF8に設定されています。あなたのあなたのハック「」で立ち往生ContentEncodingプロパティを変更する方法がないので

public NameValueCollection QueryString 
{ 
    get 
    { 
     NameValueCollection nvc = new NameValueCollection(); 
     Helpers.FillFromString(nvc, this.Url.Query, true, this.ContentEncoding); 
     return nvc; 
    } 
} 

:ここHttpListenerRequestののQueryStringプロパティからsnipitです。とにかく、私はあなたのHttpUtility.ParseQueryStringの使用はおそらく最高のあなたに役立つと思う。

+0

それを調べてくれてありがとう。私はこれがバグかどうか疑問に思っています(私は、RFCがUrl-8エンコーディングと書いていると思います)。それでも、 'Url'プロパティは正しいと思われますが、' QueryString'プロパティは間違っています。 –

+0

これはバグです(それだけではありません)。 ContentEncodingヘッダーは、URLではなくHTTP要求の本文にのみ使用する必要があります。それでも、仕様/規格が貧弱なために、その意味は多少あいまいです。 –

関連する問題