.net 具有反射提供程序的WCF OData服务

.net 具有反射提供程序的WCF OData服务,.net,wcf,odata,.net,Wcf,Odata,我们需要为活动提要提供一个API(想想Facebook),我们决定尝试一下OData。我们使用的是.NET,所以我们选择了WCF数据服务,但我们不使用实体框架(或任何其他ORM),所以我们将使用反射提供程序。因为我们的检索方法具有复杂的业务逻辑,所以我们决定将它们公开为服务操作。但是,我们希望将删除/更新和单个实体选择公开为普通ODataREST资源。我的问题是,我们如何为反射提供程序实现一个数据源,该数据源限制对集合的访问,但允许对单个实体的访问(按键请求)、允许删除/放置/张贴动词,以及允许

我们需要为活动提要提供一个API(想想Facebook),我们决定尝试一下OData。我们使用的是.NET,所以我们选择了WCF数据服务,但我们不使用实体框架(或任何其他ORM),所以我们将使用反射提供程序。因为我们的检索方法具有复杂的业务逻辑,所以我们决定将它们公开为服务操作。但是,我们希望将删除/更新和单个实体选择公开为普通ODataREST资源。我的问题是,我们如何为反射提供程序实现一个数据源,该数据源限制对集合的访问,但允许对单个实体的访问(按键请求)、允许删除/放置/张贴动词,以及允许访问单个实体的子集合(即服务/类别(1)/产品)。基本上,我只想限制对基本集合的访问(即服务/类别或服务/产品)

这里没有很好的答案

在InitializeService(..)中可以使用两种设置

不幸的是,这两种方法都不能完全满足您的要求:

  • EntitySetRights.ReadSingle
    限制您仅从该集合返回一个对象。它失败,因为它不允许此/Categories(1)/产品,并且它还允许/Categories?$filter=。。。返回一行
  • SetEntitySetPageSize
    将影响服务器的初始负载量限制为仅一条记录,但您可以按照$skiptoken一次获取一条记录的其余数据,就像(1)它允许任意查询,而不仅仅是键谓词
  • 这让你只有一个现实的选择。访问LINQ表达式并确定是否允许尝试的内容

    因为您使用的是反射提供程序,所以在传递查询之前,基本上需要包装从“context”类返回的iQueryTables并查找无效查询

    不是给晕倒的人吃的

    如果你决定走这条路,你会发现我的建议很有用,你也应该看看

    希望这有帮助


    Alex(OData项目经理)

    非常感谢。在评估选项时,我实际上阅读了您的包装示例和自定义数据提供程序系列。第一个解决方案实际上似乎并不那么糟糕。我必须检查有多少实体将有子集合,以及有多少实体需要处理。我想知道的另一件事是,在这种情况下是否可以抛出异常。这看起来很糟糕,但其他的选择也不尽如人意。包裹液体容器看起来真的很痛苦。老实说,我宁愿放弃OData解决方案,转而使用其他服务类型,也不愿这样做。
    config.SetEntitySetAccessRule("Feed", EntitySetRights.ReadSingle);
    config.SetEntitySetPageSize("Feed", 1);