我们需要为 Activity Feed 提供 API(想想 Facebook),我们决定尝试 OData。我们使用的是 .NET,所以我们选择了 WCF 数据服务,但我们不使用实体框架(或任何其他 ORM),因此我们将使用反射提供程序。因为我们的检索方法有复杂的业务逻辑,所以我们决定将它们公开为服务操作。但是,我们希望将删除/更新和单个实体选择公开为普通的 OData REST 资源。我的问题是我们如何为反射提供者实现一个数据源,它限制对集合的访问但允许访问单个实体(通过键请求),允许 DELETE/PUT/POST 动词,还允许访问单个实体的子集合(即服务/类别(1)/产品)。基本上我只想限制对基本集合的访问(即
问问题
1655 次
1 回答
5
这里没有很好的答案。
您可以在 InitializeService(..) 中使用两种设置
config.SetEntitySetAccessRule("Feed", EntitySetRights.ReadSingle);
config.SetEntitySetPageSize("Feed", 1);
不幸的是,两者都不完全符合您的要求:
EntitySetRights.ReadSingle
限制您只返回该集合中的一个对象。失败是因为它不允许这个 /Categories(1)/Products 并且它还允许 /Categories?$filter=... 返回一行。SetEntitySetPageSize
将命中服务器的初始负载量限制为仅一条记录,但您可以按照 $skiptoken 一次获取一条记录的其余数据,就像 (1) 它允许任意查询而不仅仅是关键谓词。
这使您只有一个现实的选择。访问 LINQ 表达式并确定是否允许正在尝试的内容。
由于您使用的是反射提供程序,因此您基本上需要包装从“上下文”类返回的 IQueryables 并查找无效查询,然后再传递它们。
不适合胆小的人。
如果您决定走这条路,您会发现我的IQueryable 包装示例很有用,您也应该查看有关数据服务表达式的 Viteks 博客文章系列。
希望这可以帮助
Alex(OData 项目经理)
于 2010-09-17T18:27:57.570 回答