使用Reflection Provider的WCF OData服务

Sti*_*gar 6 .net wcf odata

我们需要为活动源提供API(想想Facebook),我们决定尝试OData.我们正在使用.NET,因此我们选择了WCF数据服务,但我们不使用Entity Framework(或任何其他ORM),因此我们将使用Reflection Provider.因为我们的检索方法有复杂的业务逻辑,所以我们决定将它们作为服务操作公开.但是,我们希望将删除/更新和单个实体选择公开为普通的OData REST资源.我的问题是我们如何为反射提供者实现数据源,限制对集合的访问,但允许访问单个实体(由密钥请求),允许DELETE/PUT/POST动词,还允许访问单个实体的子集合(即服务) /分类(1)/产品).基本上我只想限制对基本集合的访问(即

Ale*_*mes 5

这里没有很好的答案.

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

config.SetEntitySetAccessRule("Feed", EntitySetRights.ReadSingle);
config.SetEntitySetPageSize("Feed", 1);
Run Code Online (Sandbox Code Playgroud)

不幸的是,你没有做到你想要的:

  1. EntitySetRights.ReadSingle限制您只从该集合返回一个对象.哪个失败,因为它不允许这个/ Categories(1)/ Products AND它还允许/ Categories?$ filter = ...返回一行.
  2. SetEntitySetPageSize 将命中服务器的初始加载量限制为只有一条记录,但你可以按照$ skiptoken去获取其余的数据,一次只记录一条记录,就像(1)它允许任意查询而不仅仅是关键谓词.

这让你只有一个现实的选择.访问LINQ表达式并确定是否允许正在尝试的内容.

由于您使用的是Reflection提供程序,因此您基本上需要在传递它们之前包装从"context"类返回的IQueryables并查找无效查询.

对于晕倒的人来说,这不是什么好事.

如果您决定沿着这条路走下去,您会发现我的IQueryable包装示例很有用,您也应该查看有关数据服务表达式的Viteks博客文章系列.

希望这可以帮助

Alex(OData项目经理)

  • 非常感谢你.在评估选项时,我实际上阅读了您的包装示例和自定义数据提供程序系列.实际上,第一个解决方案似乎并不那么糟糕.我将不得不检查有多少实体将拥有子集合以及我将需要解决多少实体.我徘徊的另一件事是,如果在这种情况下抛出异常是可以的.看起来很糟糕,但其他选择也不是很好.包装IQueryable似乎真的很痛苦.老实说,我宁愿放弃OData解决方案,而是选择其他服务类型. (2认同)