2017-09-16 26 views
1

パラメータを持つコントローラにC#Web APIのエンドポイントがあります。このパラメータは暗号化された文字列を受け取り、この文字列には "/"、 "&"、 "+"などの文字が含まれていますので、APIのエンドポイントをjavascriptから呼び出すときはいつでもencodeURIComponent関数を使用してエンコードします。私は符号化された文字列を期待しているので、私はWeb Apiコードの中でHttpUtility.UrlDecodeを使ってデコードし、それを私のアプリで使いました。C#Web Apiアクションメソッドがクエリパラメータを自動的にデコードする

public HttpActionResult MyAction(string encodedString) 
{ 
    string decodedString = HttpUtility.UrlDecode(encodedString); 
    // Process request 
} 

コードが正常に動作するかどうかをチェックするために、エンコードされた文字列を入力として送信することでデバッグを開始しました。私の驚いたことに、私は、入力パラメータが既にそれ自身でデコードし、アクションメソッドでそれを渡すことを発見しました。これは私が使用したデコーダの方法でうまく動作しましたが、 "+"文字があるときにはじくのを始めました。 "+"文字で文字列を渡すと、デコーダメソッドはそれを空白に変更しました。

djdh67-y&+dsdjをデコーダに渡すとdjdh67-y& dsdj

私には2つの驚きがありました。まず、なぜパラメータが自分自身と2番目にデコードされたのですか?なぜ "+"文字が空白スペースにデコードされたのですか?私は何が起こっているのか理解するまでこのコードを使用することはできません。なぜなら、後で(おそらく自動デコードの停止)、それはうまくいかないかもしれないからです。

正確に何が起こっているのか、この問題を解決する最良の方法は何かを説明できますか?

答えて

3

HttpUtility.UrlDecode(encodedString)部分を削除するだけで、問題を解決できます。

アクションに来る値はすでにデコードされており、は2回目のデコードを行う必要はありません。あなたの例では

GET

encodeURIComponent("djdh67-y&+dsdj")  -> djdh67-y%26%2Bdsdj // sent 
HttpUtility.UrlDecode("djdh67-y%26%2Bdsdj") -> djdh67-y&+dsdj  // done 
HttpUtility.UrlDecode("djdh67-y&+dsdj")  -> djdh67-y& dsdj  // wrong 

ないエンコードされた値が間違ってブラウザによって解釈することができます。例えば要求文字列内のシンボル&は、次のパラメータを意味します。そのため、MVCはすべてのgetパラメータがエンコードされ、デコードされると「考える」のです。

文字列が変更されていない状態で必要な場合は、POST要求の本文に渡す必要があります。

+0

に変換されます。デコード方法を削除すると問題が解決することがわかります。エンコードされた文字列が自動的にどのようにデコードされたかを知りたいasp.net Web Apiの内部機能のためですか? configを使って制御することはできますか?毎回100%の文字列をデコードしますか? – nak

+0

「GET」を使用することはできません。 'GET'パラメータはブラウザで正しく処理されるようにエンコードする必要があるためです。しかし、 'POST'リクエストの場合には自動的にエンコード/デコードされません。クエリを 'POST'に変更し、データを** body **にデコードしないでください。 – ASpirin

0

上記の答えを追加するには、+文字をスペースにデコードすることが、エンコードのデコード方法と同じです。スペースは+にエンコードされ、スペースにデコードされます。

Google検索では、次のような動作が確認できます。 google検索ボックスにスペースを含む文字列を入力して検索をクリックすると、URLを確認すると、検索キーワードを持つクエリパラメータ "q"が表示されます。これらはエンコードされ、用語のスペースは+

関連する問題