パラメータを持つコントローラに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番目にデコードされたのですか?なぜ "+"文字が空白スペースにデコードされたのですか?私は何が起こっているのか理解するまでこのコードを使用することはできません。なぜなら、後で(おそらく自動デコードの停止)、それはうまくいかないかもしれないからです。
正確に何が起こっているのか、この問題を解決する最良の方法は何かを説明できますか?
に変換されます。デコード方法を削除すると問題が解決することがわかります。エンコードされた文字列が自動的にどのようにデコードされたかを知りたいasp.net Web Apiの内部機能のためですか? configを使って制御することはできますか?毎回100%の文字列をデコードしますか? – nak
「GET」を使用することはできません。 'GET'パラメータはブラウザで正しく処理されるようにエンコードする必要があるためです。しかし、 'POST'リクエストの場合には自動的にエンコード/デコードされません。クエリを 'POST'に変更し、データを** body **にデコードしないでください。 – ASpirin