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