アクティビティ フィード (Facebook を考えてください) 用の API を提供する必要があり、OData を試してみることにしました。.NET を使用しているため、WCF Data Service を選択しましたが、Entity Framework (またはその他の ORM) を使用していないため、Reflection Provider を使用します。検索メソッドには複雑なビジネス ロジックがあるため、それらをサービス操作として公開することにしました。ただし、削除/更新と単一のエンティティ選択を通常の OData REST リソースとして公開したいと考えています。私の質問は、コレクションへのアクセスを制限するが、(キーによって要求された) 単一のエンティティへのアクセスを許可し、DELETE/PUT/POST 動詞を許可し、単一エンティティの子コレクション (つまり、サービス/Categories(1)/Products)。基本的に、ベース コレクションへのアクセスのみを制限したい (つまり
1655 次
1 に答える
5
ここには素晴らしい答えはありません。
InitializeService(..) 内で使用できる設定は 2 つあります。
config.SetEntitySetAccessRule("Feed", EntitySetRights.ReadSingle);
config.SetEntitySetPageSize("Feed", 1);
残念ながら、どちらもあなたが望むことを正確に行いません:
EntitySetRights.ReadSingle
そのセットから 1 つのオブジェクトのみを返すように制限します。この /Categories(1)/Products を許可せず、かつ /Categories?$filter=... 行を返すことも許可するため、これは失敗します。SetEntitySetPageSize
サーバーにヒットする初期ロードの量を 1 つのレコードに制限しますが、$skiptoken に従って、残りのデータを一度に 1 レコードずつ取得できます。(1) と同様に、キー述語だけでなく、任意のクエリを許可します。
つまり、現実的な選択肢は 1 つしかありません。LINQ式にアクセスし、試行されていることを許可するかどうかを調べます。
Reflection プロバイダーを使用しているため、基本的には、「コンテキスト」クラスから返される IQueryables をラップし、無効なクエリを探してから渡す必要があります。
気弱な人のためのものではありません。
その道を進むことにした場合は、私のIQueryable ラッピングの例が役立つことがわかります。また、Data Service 式に関する Viteks のブログ投稿シリーズもチェックしてください。
お役に立てれば
アレックス (OData プログラム マネージャー)
于 2010-09-17T18:27:57.570 に答える