操作而不是查询拦截器(WCF数据服务)

时间:2014-04-21 18:31:52

标签: c# security wcf-data-services queryinterceptor

我正在阅读query interceptors。我很失望,因为那更像是过滤器而不是拦截器。换句话说,您可以收集包含记录或不包括它们。例如,您无法修改记录。

如果我想为我的实体Users创建一个查询拦截器,我可以这样做:

[QueryInterceptor("Users")] // apply to table users
public Expression<Func<User, bool>> UsersOnRead()
{
    return cust => cust.IsDeleted == false;
}

如果我改为创建操作该怎么办: 注意非常重要的是操作名称只能是实体名称,否则它将无法工作

[WebGet]
public IEnumerable<User> Users()
{                    
    return this.CurrentDataSource.Users.Where(x=>x.IsDeleted==false);
}

放置此方法而不是查询拦截器使我的服务行为完全相同。另外,我有更多的力量!采用这种方法是更好的解决方案吗?

1 个答案:

答案 0 :(得分:5)

我用这个玩了一下,其中一个问题是导航属性不会被过滤掉。假设您有一个名为SalesPeople的实体,该实体具有IEnumberable of Customers的链接

如果你这样做

[QueryInterceptor("Customers")] // only show active customers
public Expression<Func<Customers, bool>> ActiveCustomers()
{
    return cust => cust.IsDeleted == false;
}

当您像WCFDataService.svc / SalesPeople一样查询OData供稿时?$ expand =客户为客户设置的结果仍将应用过滤器。

但是这个

[WebGet]
public IQueryable<Customers> Customers()
{                    
    return this.CurrentDataSource.Customers.Where(x=>x.IsDeleted==false);
}

当像WCFDataService.svc / Customers一样运行OData查询时,您将拥有活动客户的筛选列表,但在运行此WCFDataService.svc / SalesPeople时?$ expand = Customers,为客户设置的结果将包括已删除的客户。