OData Web API を作成しましたが、主キーにスラッシュが含まれているデータの検索に問題があります。
この URL は期待どおりにデータを返します:
/api/SalesOrders('12345')
ただし、キーにスラッシュが含まれているものは失敗します:
/api/SalesOrders('12345/1')
エンコードされている場合でも:
/api/SalesOrders('12345%2F1')
表示されたエラー (以下を参照) では、最後のスラッシュがクエリ文字列ではなく URL の一部であるため、予想どおりバックスラッシュに変換されているように見えます。
代わりに、スラッシュがクエリ文字列にある次の URL を使用すると、データが正しく返されます:
/api/SalesOrders?$filter=SalesOrderNumber eq 12345/1
自分で URL を生成していた場合、これは大きな問題にはなりません。
ただし、OData v4 Client Code Generatorを使用しています
したがって、コード内の呼び出しは実際には次のようになります。
var salesOrder = erpClient.SalesOrders.ByKey(worksOrder.SalesOrderNumber).GetValue();
これにより、クエリ文字列の前にスラッシュを含む URL が生成されるため、失敗します。
- これは OData v4 クライアントの既知の問題ですか?
- 主キー タイプの呼び出しでクエリ文字列の使用を強制する設定はありますか?
次のようにスラッシュをクエリ文字列に強制することで、これを回避できます。
var salesOrder = erpClient.SalesOrders.Where(so => so.SalesOrderNumber == "12345/1" && so.SalesOrderNumber == so.SalesOrderNumber).FirstOrDefault();
これにより、スラッシュがクエリ文字列に強制的に挿入されます:
/api/SalesOrders?$filter=SalesOrderNumber eq '450993/1' and SalesOrderNumber eq SalesOrderNumber
これは面倒です。OData v4 クライアントを使用しているアプリがいくつかあるため、OData v4 クライアントから離れることは避けたいと思います。
この作業をもう少しきれいにするために他にできることはありますか?
脚注:
このブログのプロセスに従って特殊文字を処理しましたが、スラッシュの処理方法に関するアドバイスは含まれていません。