【问题标题】:Operation instead of query interceptor (WCF Data Services)操作而不是查询拦截器(WCF 数据服务)
【发布时间】:2014-04-21 18:31:51
【问题描述】:

我正在阅读有关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);
}

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

【问题讨论】:

  • 这是一个非常有趣的观点。对实体的更新是否有效,或者 WebGet 是否也会覆盖它?此外,如果您想支持查询选项,您将需要公开 IQueryable 而不是 IEnumerable。我猜 WCF 团队没有想到这种情况,所以如果您遇到任何问题,您可能会靠自己。
  • 如果我想更新引用,我必须取消注释这些操作。在客户端应用程序上添加服务引用后,我可以取消注释这些操作并且效果很好。

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


【解决方案1】:

我对此进行了更多尝试,其中一个问题是导航属性不会被过滤。假设您有一个名为 SalesPeople 的实体,它具有指向 IEnumberable of Customers 的链接

如果你这样做

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

当您查询 OData 提要(如 WCFDataService.svc/SalesPeople?$expand=Customers)时,为客户设置的结果仍将应用过滤器。

但是这个

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

运行 WCFDataService.svc/Customers 之类的 OData 查询时,您将获得活动客户的过滤列表,但运行此 WCFDataService.svc/SalesPeople?$expand=Customers 时,客户的结果集将包括已删除的客户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多