共用方式為


服務作業和攔截器 (ADO.NET 資料服務架構)

ADO.NET 資料服務可讓服務作業和 (或) 攔截器的定義擴充將 URI 對應至資源的模型。

將商務邏輯加入至資料服務

例如,當您需要使用商務邏輯來實作驗證邏輯或安全性時,就可以使用服務作業。服務作業可讓開發人員在伺服器上定義方法,而此方法就如同其他 ADO.NET 資料服務資源一樣,由 URI 所識別。這些服務作業是加入至衍生自 DataService (代表資料服務) 之類別 (Class) 的方法。

建立服務作業

若要實作服務作業,請將公用 (Public) 執行個體 (Instance) 方法定義成衍生自 DataService 類別 (代表資料服務) 之資料服務類別的一部分。

  • 此方法必須僅接受 [in] 參數。

    • 如果定義了參數,每個參數的型別都必須是基本型別 (Primitive Type)。
  • 此方法必須傳回虛值 (Void)、IEnumerable<T>IQueryable<T>T 或基本類別,例如整數或字串。

    • T 必須是在資料服務所公開 (Expose) 的資料模型中代表實體類型的類別。

    • 為了支援排序、分頁和篩選等查詢選項,服務作業方法應該傳回 IQueryable<T>

  • 此方法必須以 [WebGet][WebInvoke] 屬性加上附註。

    • [WebGet] 可讓您使用 GET 要求來叫用 (Invoke) 此方法。

    • [WebInvoke] 可讓您使用 PUT、POST 或 DELETE 要求來叫用此方法。

  • 服務作業可能會以 SingleResultAttribute 加上附註,以便指定此方法的傳回值是單一實體而非實體的集合。這項區別會指定回應的結果序列化 (Serialization)。例如,使用 AtomPub 序列化時,單一資源類型執行個體會表示成 entry 項目,而一組執行個體則表示成 feed 項目。

如果某個方法沒有遵循上述定義的慣例,它就不會在資料服務內部公開成服務作業。

定址服務作業

根據 ADO.NET 資料服務通訊協定 (Protocol) 規格,您可以將方法的名稱放在 URI 的第一個路徑區段中,藉以定址服務作業。此外,您可以將其他路徑區段或查詢選項加入至 URI,端視服務作業的傳回型別而定。

有效的傳回型別 URI 規則

Void

允許使用成為服務作業名稱的單一路徑區段。

不允許使用系統查詢選項。

IEnumerable<T>

允許使用成為服務作業名稱的單一路徑區段。

不允許使用系統查詢選項。

IQueryable<T>

根據 ADO.NET Data Services Protocol規格中的路徑建構規則,允許使用其他 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 資料服務可讓資料服務開發人員攔截要求/回應管線,以及插入自訂驗證邏輯。在 ADO.NET 資料服務中,攔截器扮演了雙重角色。它們可讓驗證邏輯加入至處理管線,並且提供了一個位置,可針對每個要求插入自訂授權原則。

Cc668788.note(zh-tw,VS.100).gif注意:
查詢攔截器無法接受參數。

要求/URI 處理

當資料服務收到 GET 要求時,系統就會處理要求 URI,而且會呼叫針對資料服務所定義的任何查詢攔截方法。下列範例會顯示攔截訂單 GET 要求之查詢攔截器方法的實作 (Implementation)。這個攔截器只會傳回指派給 CustomerID=="AROUT" 之客戶的訂單。需要其他程式碼才能驗證傳送此要求的使用者,讓這個方法會傳回指派給每位使用者的訂單。

    [QueryInterceptor("Orders")]
    public Expression<Func<Orders, bool>> FilterOrdersByCustomer()
    {
        return o => o.Customers.CustomerID == "AROUT";
    }

另請參閱

其他資源

Business Logic
URI Format for Addressing Resources (ADO.NET Data Services)
Entity Data Model (EDM)