ADO.NET Data Services では、URI をリソースにマッピングするモデルを拡張するサービス操作やインターセプタの定義ができます。
データ サービスへのビジネス ロジックの追加
サービス操作は、ビジネス ロジックが必要な場合に使用できます。たとえば、検証ロジックやセキュリティを実装するために使用できます。開発者はサービス操作を使用して、サーバーでメソッドを定義できます。このメソッドは、他の ADO.NET Data Service リソースと同様に、URI により識別されます。これらのサービス操作は、データ サービスを表す DataService から派生したクラスに追加されるメソッドです。
サービス操作の作成
サービス操作を実装するには、データ サービスを表す DataService クラスから派生したデータ サービス クラスの一部としてパブリック インスタンス メソッドを定義します。
メソッドは、
[in]
のパラメータのみを受け入れる必要があります。- パラメータを定義する場合、各パラメータの型はプリミティブ型である必要があります。
メソッドからは、void、IEnumerable<T>、IQueryable<T>、T、または整数型や文字列型などのプリミティブ クラスが返される必要があります。
T は、データ サービスによって公開されるデータ モデルのエンティティ型を表すクラスである必要があります。
並べ替え、ページング、フィルタ処理などのクエリ オプションをサポートするために、サービス操作メソッドから IQueryable<T> が返される必要があります。
メソッドには、
[WebGet]
属性または[WebInvoke]
属性を使用して注釈を付ける必要があります。[WebGet]
では、GET 要求を使用してメソッドを呼び出すことができます。[WebInvoke]
では、PUT 要求、POST 要求、または DELETE 要求を使用してメソッドを呼び出すことができます。
サービス操作には、SingleResultAttribute を使用して注釈を付けることができます。この属性は、メソッドからの戻り値がエンティティのコレクションではなく 1 つのエンティティとなるように指定します。このように指定すると、応答のシリアル化が指示されます。たとえば、AtomPub シリアル化を使用すると、1 種類のリソースのインスタンスがエントリ要素として表され、一連のインスタンスがフィード要素として表されます。
メソッドが上記に定義した規則に従っていない場合、データ サービス内でサービス操作として公開されません。
サービス操作のアドレス指定
ADO.NET Data Service プロトコルの仕様に従って、URI の最初のパス セグメントにメソッドの名前を入れることによって、サービス操作のアドレスを指定します。サービス操作の戻り値の型によっては、パス セグメントやクエリ オプションをさらに URI に追加できます。
有効な戻り値の型 | URI のルール |
---|---|
Void |
サービス操作の名前である 1 つのパス セグメントが許可されます。 システム クエリ オプションは許可されません。 |
IEnumerable<T> |
サービス操作の名前である 1 つのパス セグメントが許可されます。 システム クエリ オプションは許可されません。 |
IQueryable<T> |
ADO.NET Data Service 仕様仕様のパス構築ルールに従った追加の URI パス セグメントが許可されます。 システム クエリ オプションは許可されます。 |
サービス操作の追加
次の例では、Entity Framework ベースのモデルを公開するデータ サービスにサービス操作を実装します。
public class Northwind :
DataService<NorthwindModel.NorthwindEntities>
{
public static void InitializeService(IDataServiceConfiguration config)
{
// Entity sets access configuration.
config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
// Service operations access configuration.
config.SetServiceOperationAccessRule("OrdersByCity",
ServiceOperationRights.All);
}
[WebGet]
public IQueryable<Orders> OrdersByCity(string city)
{
if (string.IsNullOrEmpty(city))
{
throw new ArgumentNullException("city",
"You must provide a city name argument");
}
return this.CurrentDataSource.Orders.Where(
"it.ShipCity = @city",
new ObjectParameter("city", city));
}
}
サービス操作を呼び出すには、次の URI を使用します。
https://server/Northwind.svc/OrdersByCity?city='London'
サービス操作の戻り値の型が IQueryable<T> なので、追加の URI セグメントが許可されます。たとえば、次の URI は有効です。
https://server/Northwind.svc/OrdersByCity?city='London'&$top=2
https://server/Northwind.svc/OrdersByCity?city='London'&$top=10&$orderby=OrderID
サービス操作のアクセス制御
サービス操作のサービス全体の表示は、エンティティ セットの表示を制御するのとほぼ同様に、IDataServiceConfiguration クラスでメソッドによって制御します。たとえば、上記の例の CustomersByCity
メソッドにアクセス可能にするには、次の図のコードを DataService から派生したクラスに追加します。
public class Northwind : DataService<NorthwindEntities>
{
public static void InitializeService(
IDataServiceConfiguration config)
{
config.SetServiceOperationAccessRule("CustomersByCity",
ServiceOperationRights.All);
}
[WebGet]
public IQueryable<Customer> CustomersByCity(string city)
{… }
}
インターセプタ
データ サービスの開発者は ADO.NET Data Services を使用して、要求/応答パイプラインを遮断し、カスタム検証ロジックを挿入できます。ADO.NET Data Services では、インターセプタには 2 つの働きがあります。検証ロジックを処理パイプラインに追加することと、要求ごとにカスタム認証ポリシーを挿入する場所を設定することです。
[!メモ]
クエリ インターセプタではパラメータを使用できません。
要求/URI の処理
GET 要求がデータ サービスによって受信されると、要求 URI が処理され、データ サービスで定義されたクエリ インターセプタのメソッドが呼び出されます。次の例は、注文に対する GET 要求を遮断するクエリ インターセプタのメソッドの実装を示しています。このインターセプタでは、CustomerID=="AROUT"
の場合に顧客に割り当てられる注文のみが返されます。このメソッドによって各ユーザーに割り当てられる注文が返されるように、要求を送信するユーザーを認証するためのコードがさらに必要となります。
[QueryInterceptor("Orders")]
public Expression<Func<Orders, bool>> FilterOrdersByCustomer()
{
return o => o.Customers.CustomerID == "AROUT";
}
参照
概念
データ サービスの拡張機能 (ADO.NET Data Services フレームワーク)
リソースのアドレスを指定する URI 形式 (ADO.NET Data Services フレームワーク)