【问题标题】:Wanting to Override what is returned in WCF for EntityType Data想要覆盖 WCF 中为 EntityType 数据返回的内容
【发布时间】:2011-09-04 16:38:13
【问题描述】:

我在我的模型中定义了一个名为SessionsOverview 的实体。我通过 WCF 服务公开它,代码如下:

public static void InitializeService(DataServiceConfiguration config)
{
    // Examples:
    config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
    config.SetServiceOperationAccessRule("*", ServiceOperationRights.AllRead);
    config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}

它在一个名为ModelSessionView.Designer.cs的文件中创建了一堆代码

在该代码中,它当前有一个名为 SessionsOverviews 的方法,该方法返回一个 .net 对象。我想覆盖基于某些安全规则返回的内容。具体来说,我想查看我的 app.config,获取一个设置,如果该设置不正确,我想隐藏这个对象中的一些数据。我可以开始更新这个文件,但这似乎是错误的。有没有明确的地方我应该添加这样的逻辑?

谢谢

    /// <summary>
    /// No Metadata Documentation available.
    /// </summary>
    public ObjectSet<SessionsOverview> SessionsOverviews
    {
        get
        {
            if ((_SessionsOverviews == null))
            {
                _SessionsOverviews = 
                  base.CreateObjectSet<SessionsOverview>("SessionsOverviews");
            }
            return _SessionsOverviews;
        }
    }

【问题讨论】:

  • 有人有什么想法吗?我的问题没有任何意义吗?

标签: c# wcf entity-framework entity-framework-4 poco


【解决方案1】:

您是否尝试过使用 QueryInterceptor 的?

这些在服务类中指定并返回一个您可以自己编写的表达式。

一个简单的例子定义如下:

[QueryInterceptor("SessionsOverviews")]
public Expression<Func<SessionsOverview, bool>> SessionsOverviewFilter()
{
    var configValue = readfromconfig;

    if (configValue == "something")
    {
        return (session) => session.thePropertyToFilteron == configValue;
    }

    return (session) => true;
}

此外,您还可以指定 ChangeInterceptors。

更多详情请参阅以下文章

http://msdn.microsoft.com/en-us/library/dd744842.aspx

【讨论】:

  • 是否可以更改数据??我得到的表达式树可能不包含赋值运算符错误。
  • no 从拦截器返回的数据必须是要返回的类型。在上面的示例中,表达式树将被更改为将 where 限制应用于最终查询。类似于 SessionsOverview.thePropertyToFilteron == 'foo' 的地方。答案有错别字,抱歉。它应该是 == 而不是 =。
  • 不确定这是否有意义,但如果要在发送查询结果之前对其进行操作(相同类型但更改数据)。这个逻辑应该在哪里实现?更喜欢有一个强类型的对象来处理。谢谢
  • 拦截器向 IQueryable 对象添加了一个过滤器,因为只有在您遍历结果或在其上调用贪婪方法时才会执行此过滤器,您可以在任何地方更改数据。如果您想更改正在返回的对象中的物理数据,那么我会考虑编写一个服务操作。这只是一个方法调用,您可以在其中直接更改数据。 odata.org/developers/protocols/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 2023-03-11
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多