WCF Dataservice - 在返回结果之前修改对象?

时间:2011-09-11 08:19:31

标签: c# entity-framework-4 wcf-data-services

我正在使用WCF数据服务,我有一些字段/属性,我想在发送回客户端之前将其“空白”(将值设置为空字符串或null)。

例如:用户表有密码列,我不想将值传递给客户端。这是一个示例,应用程序中还有其他此类列,出于安全/隐私原因,应排除该值。

很抱歉这样一个基本问题,我是WCF数据服务的新手,还没有找到任何有希望的线索。我已经尝试过QueryInterceptors,但没有运气。

有人能指出我正确的方向吗?

由于

1 个答案:

答案 0 :(得分:4)

IMO这超出了WCF数据服务的范围。 WCF数据服务旨在获取您的实体模型并根据访问规则公开它。如果您的实体公开某些属性并且该实体已公开,则其属性仅为公共属性。它适用于简单的CRUD方案或只读方案。

QueryInterceptor无法帮助您,因为它可以用于数据驱动授权 - 这意味着QueryInterceptor可以添加一些额外条件来过滤当前用户不允许看到的记录=它将过滤输出整个记录,但不会修改过滤结果。

没有挂钩到空字段,因为这是一个糟糕的方法。如果您不想暴露某些字段,则它们根本不应成为公开实体的一部分。您可以使用EDMX文件中的QueryView创建仅显示公共字段的第二个只读实体。接下来,您需要修改DataServiceConfiguration中的访问规则。您必须将访问规则删除到初始User实体集,并将读访问规则添加到该新实体集。

如果您需要控制每个用户的访问规则,您必须在服务中使用某种authentication,并且必须使用InitializeService方法处理此问题(除非DataServiceConfiguration在其他地方可用) 。类似的东西:

public static void InitializeService(DataServiceConfiguration config)
{
    var context = ServiceSecurityContext.Current;
    if (context != null && context.PrimaryIdentity != null)
    {
        var userName = context.PrimaryIdentity.Name;
        if (SomeMethodToValidateUserPermissions(userName)
        {
            config.SetEntitySetAccessRule("Users", EntitySetRights.AllRead);
        }
    }

    config.SetEntitySetAccessRule("TrimmedUsers", EntitySetRights.AllRead);
} 

通过更深入地了解WCF,可以有其他方法来限制对某些资源的访问,但这个方法最简单。