ルーティングに System.ServiceModel ライブラリを使用して、次のような単純なテンプレートを持つ REST サービスを作成しました。
"{searchTerm}?opt={someSearchOpt}
したがって、呼び出しは次のようになります。
オプションなしで「river expeditions」という語句を検索します。
これは単純に検索フレーズを受け入れ、結果を返します。それはうまく動作します。ただし、「Lewis&Clark」などのリテラル アンパサンドを含むフレーズを検索する場合は、アンパサンドをエンコードする URL の自明なものを試しました。
ルイス%26クラーク
それでもリクエストがルーティングされることはありませんが、サーバーはすぐに 400 Bad Request を返します。この特定のテンプレートは url パラメーターを予期しており、先行する「?」がないため、クエリ文字列区切り文字として解釈され、リクエストが無効になることは明らかです。デリミタ。
これらの検索フレーズには他の制限された文字が含まれている可能性があるため、クライアントによってエンコードされた URL によって検索されることが期待され、それらが正常にルーティングされると、REST API はパラメーターで HttpUtility.UrlDecode を呼び出します。したがって、私の質問は、URLエンコードされたアンパサンドを残りのURLパラメーターとして正しくルーティングし、先制的に解釈してクエリ文字列区切り文字として拒否しない方法があるかどうかです。
更新: レコードについては、検索語が (url パラメーターではなく) クエリ文字列パラメーターとして予期されていた場合、Lewis%26Clarkの送信は正常に機能します。例えば
http://myhost.contoso.com/searchapi?searchTerm=lewis%26clark
明確にするために、REST テンプレートで url パラメーターを使用したときに同じ結果を得ようとしています。