現在OData v3を使用していますが、これはOData v4でも失敗しているようです。UriがアンパサンドをエスケープしたときにODataフィルタオプションが失敗する
のは、私は以下のウリとしましょう:$フィルター
http://myurl.com/odata/SomeEndpointを=フィールド識別子EQ 1 & $トップ= 10
パーフェクト、郵便配達やブラウザにそのを入力し、素晴らしい作品?。しかし、私がウリをエンコードすると失敗します。
HTMLエンコーディング:
http://myurl.com/odata/SomeEndpoint $フィルタ=フィールド識別子EQ 1 &アンペア; $エスケープ文字がクエリに適用されます前に、トップ= 10
すべて(そう$フィルタはまだ動作します)が、後にすべてのもの?エスケープされた文字は無視されます($ topは適用されません)。
URIエンコード(私は両方を試してみました)?
http://myurl.com/odata/SomeEndpoint $フィルター=フィールド識別子当量1%26 $のトップ= 10 http://myurl.com/odata/SomeEndpoint $フィルター=フィールド識別子当量1%26%の$トップ= 10
両方原因次のエラー(これはメモリからあるので、言い換え)とクエリオプションを適用しようとしたときに例外をスローするためのOData:
'&' is in invalid character in query string.
$filter=FieldId eq 1&$top=10
をあなたが見ることができるように、これは望ましくないと問題です。私のクライアントがリクエストを送信する前にUriをエンコードすると、それは機能しません。また、その結果でのODataによって生成されたリンクは、例えば、符号化され、次のページへのリンク:
<リンクのrel =「次」のhref = "http://myurl.com/odata/SomeEndpoint?$filter=フィールド識別子%20eq%201 &アンペア; $ = 1"/>
のODataは正常に動作しますが、$スキップが実際にあるため、エスケープアンパサンドに無視され20%(スペース)を気にしていないようです(&アンプをスキップ;)実際のアンパサンド(&)に変更するだけで正常に動作します。
これを修正する方法はありますか?それはODataの問題であるようです。参考のため
ここでは、私は私のルートをマッピングしています方法です:
#pragma warning disable CS0618 // OData v3 route mapping.
config.Routes.MapODataRoute(
routeName: "odata",
routePrefix: "odata",
model: model);
#pragma warning restore CS0618
私は何もカスタムをやっていませんよ。私は私が手XMLに私のACCEPTヘッダーを設定
:
UPDATE
<リンクのrel = "次" のhref = "http://myurl.com/odata/SomeEndpoint?$filter=FieldId% 20eq%201 &アンペア; $ = 1" スキップ/ >を
私はJSONにヘッダをACCEPTに設定すると、私が得る:
odata.nextLink ":" http://webapi.mydlweb.com/api/test/odata/v3/Checks $フィルタ= StoreId%20eq%2040 &ページサイズ= 1を? & $ skip = 1 "
以下のコメントでは、JSONリンクが正しく生成されています。私はそれをクリックすることができ、アンパサンドはエンコードされていないため動作します。ただし、XMLリンクはアンパサンドをエンコードするため、動作しません。 XMLをエンコードするときにそれは普通ですか?クライアントはどのようにしてアンパサンドを「エンコード解除」し、エンコードを残すかをどのように知っていますか?たとえば、アンパサンドをフィルタ内で使用すると(クエリ文字列を区切らないように)、エンコードする必要があります。
更新2: 私はそれがXMLエンコーディングだと思います。それはまさにそれです。
を、それはそうです。アンパサンドをエスケープすることで、パーサにクエリー文字列の区切り文字として解釈せず、リテラル値として解釈させるように指示します。したがって、あなたの例では、アンパサンド(したがってクエリ文字列の要求)を$フィルタの一部としてインクルードしようとしているようです。 –
フィルタはJUST ** $ filter = StoreId eq 40 **でなければなりません。残りの "$ skip"や "pagesize"はフィルタの一部ではなく、他のクエリ文字列です –