【问题标题】:Is there a way to dial down the OData Service reflection provider?有没有办法拨掉 OData 服务反射提供程序?
【发布时间】:2012-02-25 17:10:11
【问题描述】:

这是我仍然遇到的问题here 的延续。我试图阻止 OData 反射提供程序尝试公开我的程序集中的所有 CLR 类。

考虑以下 CLR 类:

public class Foo
{
    public Guid FooID { get; set; }
    public string FooName { get; set; }
}

以下类将Foo 公开为IQueryable 集合:

public class MyEntities 
{ 
    public IQueryable<Foo> Foos 
    { 
        get 
        { 
            return DataManager.GetFoos().AsQueryable<Foo>(); 
        } 
    }
} 

还有以下DataService类:

public class MyDataService : DataService<MyEntities> 
{ 
    public static void InitializeService(DataServiceConfiguration config) 
    { 
        config.SetEntitySetAccessRule("Foos", EntitySetRights.All); 
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; 
    } 
}

这一切都很好,DataService 可以显示Foo 的集合。但是如果更改Foo 来扩展一个非常简单的基础对象,例如:

public class Foo : MyObjectBase
{
    public Guid FooID { get; set; } 
    public string FooName { get; set; }
}

然后(即使我只是试图公开 1 个集合),反射提供程序会抓取所有扩展 MyObjectBase 的对象,从而导致大量错误。

基类是一个简单的抽象类,它实现了许多接口并提供了另一个属性,例如:

public abstract class MyObjectBase: IDataObject, IDataErrorInfo, INotifyPropertyChanged, IDisposable
{
    public virtual Guid ID { get; set; }
}

即使将IgnoreProperties 放在此处的任何公共属性上也无济于事。有什么办法可以调低反射提供者正在做什么?

【问题讨论】:

  • 我遇到了同样的问题,我找不到好的解决方案。我最终直接在 Foo 中将 MyObjectBase 属性加倍。
  • 呃,这个项目中的几百个 CLR 类并不是一个真正的选择。仍在使用自定义提供程序路由。
  • 没错,我只有一对。你可以有 MyObjectBaseOdata 和 MyObjectBaseEverythingElse 我猜...

标签: c# wcf-data-services odata iqueryable


【解决方案1】:

你可以设置:

config.SetEntitySetAccessRule("TypeNotAccessible", EntitySetRights.All); 

config.SetEntitySetAccessRule("TypeNotAccessible", EntitySetRights.None);

在您不想访问的任何课程上。我使用自定义属性的帮助来执行此操作,该属性指示我想要的特定类的权限。这与循环所有已知类型(实现我的属性)相结合,可以在没有显式代码单独设置每个类的情况下执行此操作。

【讨论】:

  • +1 谢谢 M。我试图关闭某些课程的权限。麻烦的是,所有 DAL 类都与我想要的相应 BLL 类具有相同的名称(不同的命名空间)。您可以在 SetEntityAccessRule 中指定完整或部分命名空间吗?
  • 我从来没有这样做过,而且 MSDN 文档没有说明什么是合法的,所以我建议尝试一下,看看会发生什么。不过,这可能不是您想要的答案。
  • 在不需要的类上使用 SetEntitySetAccessRule 通常似乎没有帮助。我什至尝试关闭所有访问 config.SetEntitySetAccessRule("*", EntitySetRights.None); 并且仍然遇到在数据上下文中找不到这些类型的相同错误。
  • 我想我的尝试可能没有成功,但根据文档,“拒绝访问数据的所有权利。”不幸的是,我无法测试它(我的工作 VPN 已关闭,我对它没有足够的兴趣从头开始创建一个)
  • @DaveClemmer - Here 是一个可能有帮助的相关问题。
【解决方案2】:

我无法找到一种方法来调用具有丰富数据模型的反射提供程序。我最终构建了一个自定义提供程序,如 here 所示。

如果有人提供了一种方法来拨打反射提供者,我会接受这个答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 2011-11-28
    • 2021-02-07
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多