6

アクティビティ フィード (Facebook を考えてください) 用の API を提供する必要があり、OData を試してみることにしました。.NET を使用しているため、WCF Data Service を選択しましたが、Entity Framework (またはその他の ORM) を使用していないため、Reflection Provider を使用します。検索メソッドには複雑なビジネス ロジックがあるため、それらをサービス操作として公開することにしました。ただし、削除/更新と単一のエンティティ選択を通常の OData REST リソースとして公開したいと考えています。私の質問は、コレクションへのアクセスを制限するが、(キーによって要求された) 単一のエンティティへのアクセスを許可し、DELETE/PUT/POST 動詞を許可し、単一エンティティの子コレクション (つまり、サービス/Categories(1)/Products)。基本的に、ベース コレクションへのアクセスのみを制限したい (つまり

4

1 に答える 1

5

ここには素晴らしい答えはありません。

InitializeService(..) 内で使用できる設定は 2 つあります。

config.SetEntitySetAccessRule("Feed", EntitySetRights.ReadSingle);
config.SetEntitySetPageSize("Feed", 1);

残念ながら、どちらもあなたが望むことを正確に行いません:

  1. EntitySetRights.ReadSingleそのセットから 1 つのオブジェクトのみを返すように制限します。この /Categories(1)/Products を許可せず、かつ /Categories?$filter=... 行を返すことも許可するため、これは失敗します。
  2. SetEntitySetPageSizeサーバーにヒットする初期ロードの量を 1 つのレコードに制限しますが、$skiptoken に従って、残りのデータを一度に 1 レコードずつ取得できます。(1) と同様に、キー述語だけでなく、任意のクエリを許可します。

つまり、現実的な選択肢は 1 つしかありません。LINQ式にアクセスし、試行されていることを許可するかどうかを調べます。

Reflection プロバイダーを使用しているため、基本的には、「コンテキスト」クラスから返される IQueryables をラップし、無効なクエリを探してから渡す必要があります。

気弱な人のためのものではありません。

その道を進むことにした場合は、私のIQueryable ラッピングの例が役立つことがわかります。また、Data Service 式に関する Viteks のブログ投稿シリーズもチェックしてください。

お役に立てれば

アレックス (OData プログラム マネージャー)

于 2010-09-17T18:27:57.570 に答える