服務作業和攔截器 (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 資料服務中,攔截器扮演了雙重角色。它們可讓驗證邏輯加入至處理管線,並且提供了一個位置,可針對每個要求插入自訂授權原則。
注意: |
---|
查詢攔截器無法接受參數。 |
要求/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)