【问题标题】:oData WCF service - hide an elementoData WCF 服务 - 隐藏元素
【发布时间】:2011-01-25 10:09:34
【问题描述】:

我是 WCF 的新手。我的 Web 项目有一个 ADO.NET 实体数据模型(又名 EF edmx),它的实体容器名称为 JobSystemEntities

我创建了一个简单的 oData WCF 数据服务,它使用 JobSystemEntities,效果很好:

public class JobService : DataService<JobSystemEntities>
{
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("Jobs", EntitySetRights.ReadSingle);
    }

但是,这会暴露 Job 的所有属性。我想隐藏敏感数据,即 Job 表的 Cost 字段/属性/列。

【问题讨论】:

  • 最简单的方法是在您的 EF 模型中隐藏该属性 - 例如永远不要使用/显示。你能做到吗?或者您是否可以仅为您的 OData 服务创建一个自定义 EF 模型,并在该自定义模型中的“作业”实体中隐藏该属性?
  • 我在网站中使用 Cost 字段,所以它需要在 EF 模型中。您建议为 oData 服务创建第二个 EF 模型是可能的,但我很惊讶没有其他方法可以做到这一点?

标签: wcf odata


【解决方案1】:

我发布此内容较晚,但它可能对其他人有所帮助。

您可以在您的班级上使用 IgnoreProperties 属性 http://msdn.microsoft.com/en-us/library/system.data.services.ignorepropertiesattribute.aspx

您必须定义部分 Job 类才能执行此操作。类似于:

namespace DAL.Entities
{
    [IgnoreProperties("Cost")]
    public partial class Job
    {

    }
}

【讨论】:

  • 我认为这不适用于 Entity Framework 作为您的数据层。如果您还有其他东西,那么它应该可以正常工作。
  • 我最近在一个项目中自己使用它,它与实体框架配合得很好。
  • 当它对我不起作用时,我问了这个问题:stackoverflow.com/questions/6600037/… 结果是它不适用于 POCO 模板。 (也许它确实适用于普通 EF。)
【解决方案2】:

我做过类似的事情。在这里可以找到一个很好的起点:

http://weblogs.asp.net/rajbk/archive/2010/05/15/pre-filtering-and-shaping-odata-feeds-using-wcf-data-services-and-the-entity-framework-part-1.aspx

基本上,您需要将一个实体的受保护属性分离为一个单独的实体,该实体作为另一个实体的属性链接。完成后,用户使用查询拦截器来限制何时可以查看受保护的实体。

[QueryInterceptor("YourObjectsProtectedProperties")]
public Expression<Func<YourObjectsProtectedProperties, bool>> OnReadYourObjectsProtectedProperties()
{
if (ShowEntityToUser())
   return o => true == true;
return o => true == false;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多