我们需要为活动源(想想Facebook)提供API,我们决定尝试OData。我们正在使用.NET,因此我们选择了WCF数据服务,但我们不使用Entity Framework(或任何其他ORM),因此我们将使用Reflection Provider。因为我们的检索方法有复杂的业务逻辑,所以我们决定将它们作为服务操作公开。但是,我们希望将删除/更新和单个实体选择公开为普通的OData REST资源。我的问题是我们如何为反射提供者实现数据源,限制对集合的访问,但允许访问单个实体(由密钥请求),允许DELETE / PUT / POST动词,还允许访问单个实体的子集合(即服务) /分类(1)/产品)。基本上我只想限制对基本集合(即服务/类别或服务/产品)的访问
答案 0 :(得分:5)
这里没有很好的答案。
您可以在InitializeService(..)
中使用两种设置config.SetEntitySetAccessRule("Feed", EntitySetRights.ReadSingle);
config.SetEntitySetPageSize("Feed", 1);
不幸的是,你也没想做到:
EntitySetRights.ReadSingle
限制您只从该集合中返回一个对象。哪个失败,因为它不允许这个/ Categories(1)/ Products AND它还允许/ Categories?$ filter = ...返回一行。SetEntitySetPageSize
将点击服务器的初始加载量限制为只有一条记录,但您可以按照$ skiptoken进行操作,一次获取一条记录的其余数据,就像(1)它允许的那样任意查询不仅仅是关键谓词。只留下一个现实选择。访问LINQ表达式并确定是否允许正在尝试的内容。
由于您使用的是Reflection提供程序,因此您基本上需要在传递它们之前包装从“context”类返回的IQueryables并查找无效查询。
对于晕倒的人来说,这不是什么好事。
如果你决定走这条路,你会发现我的IQueryable wrapping example很有用,你也应该查看Viteks blog post series on Data Service expressions。
希望这有帮助
Alex(OData项目经理)