服务操作和侦听器(ADO.NET 数据服务框架)

ADO.NET 数据服务定义了服务操作和/或侦听器来扩展 URI 到资源的映射模型。

向数据服务添加业务逻辑

在需要业务逻辑的情况下(例如实现验证逻辑或安全时),可以使用服务操作。服务操作允许开发人员在 URI 标识的服务器(类似于其他 ADO.NET 数据服务资源)上定义一个方法。这些服务操作是一些添加到派生自表示数据服务的 DataService 的类的方法。

创建服务操作

若要实现服务操作,请将一个公共实例方法定义为派生自表示数据服务的 DataService 类的数据服务类的一部分。

  • 此方法只能接受 [in] 参数。

    • 如果对参数进行定义,则每个参数的类型必须为基元类型。
  • 此方法必须返回 void、IEnumerable<T>IQueryable<T>T 或基元类(如整数或字符串)。

    • T 必须为一个类,此类表示数据服务将公开的数据模型中的某个实体类型。

    • 若要支持查询选项(如排序、分页和筛选),服务操作方法应返回 IQueryable<T>

  • 必须用 [WebGet][WebInvoke] 属性为此方法添加批注。

    • [WebGet] 使您能够通过使用 GET 请求调用此方法。

    • [WebInvoke] 使您能够通过使用 PUT、POST 或 DELETE 请求调用此方法。

  • 可以用 SingleResultAttribute 为服务操作添加批注,指定此方法的返回值是一个实体而不是一个实体集。这一区别确定了生成的响应序列化。例如,当使用 AtomPub 序列化时,单个资源类型实例将表示为一个 entry 元素,而单个实例集将表示为一个 feed 元素。

如果某个方法未遵循上面定义的约定,则不会将此方法公开为数据服务中的服务操作。

对服务操作进行寻址

根据 ADO.NET 数据服务协议规范,可通过将方法的名称放置到 URI 的第一个路径段中来对服务操作进行寻址。可以将其他路径段或查询选项添加到此 URI,具体取决于服务操作的返回类型。

有效的返回类型 URI 规则

Void

允许作为服务操作名称的单个路径段。

不允许系统查询选项。

IEnumerable<T>

允许作为服务操作名称的单个路径段。

不允许系统查询选项。

IQueryable<T>

允许遵循 ADO.NET Data Services Protocol规范中的路径构造规则的其他 URI 路径段。

允许系统查询选项。

添加服务操作

下面的示例对公开基于实体框架的模型的数据服务实现服务操作。

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 是有效的 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-cn,VS.100).gif注意:
查询侦听器不能采用参数。

请求/URI 处理

当数据服务接收到 GET 请求时,将处理请求 URI 并调用数据服务上定义的任何查询截获方法。下面的示例演示查询侦听器方法的实现,此方法可截获针对订单的 GET 请求。此侦听器仅返回分配给满足 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)