繁体   English   中英

使用Reflection Provider的WCF OData服务

[英]WCF OData service with Reflection Provider

我们需要为活动源提供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);

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

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

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

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

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

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

希望这可以帮助

Alex(OData项目经理)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM