次の方法で共有


サービス操作とインターセプタ (ADO.NET Data Services フレームワーク)

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 フレームワーク)

その他のリソース

エンティティ データ モデル