legacyCasModel =“true”和动态数据/操作

时间:2011-04-04 16:01:16

标签: asp.net asp.net-mvc permissions dynamic-data

这类似于Odd Exception in MVC 3 Project

我们有一个完全信任的ASP.NET 4.0应用程序。我们需要在web.config中包含以下行,否则我们使用的其中一个库不起作用。 (因为它明确使用了以前版本的.NET中现在过时的CAS模型)。

<trust legacyCasModel="true" />

鉴于此设置,我们无法使用动态关键字或依赖它的ASP.NET MVC的某些功能。

例如,以下代码会导致异常:

dynamic d = new object();
d.test = "jason";

例外是:

Dynamic operations can only be performed in homogenous AppDomain.

如果legacyCasModel设置为true,我有什么方法可以使动态关键字有效? (如果设置为false,一切正常,除了需要它的库。)

想法:

  1. 鉴于我完全信任,我假设AppDomain中的一个程序集正在使用减少的权限(因此非同类)。有没有办法让我简单地告诉它以完全信任模式运行,使AppDomain同质化?

  2. 我是否能够以某种方式重构我的代码以在另一个AppDomain中加载有问题的程序集?我不熟悉这种做法的典型方法,但看起来很复杂。

  3. 我可以启用其他一些神奇的配置设置吗?

1 个答案:

答案 0 :(得分:1)

我没有使用太多的DLR,但我只是尝试了快速测试。在控制台应用程序中,相当于您的命令失败...

        dynamic d = new object();
        d.test = "jason";
        Console.WriteLine(d.test);

但这成功了......

        dynamic d = new ExpandoObject();
        d.test = "jason";
        Console.WriteLine(d.test);

使用动态对象时,您可能需要使用ExpandoObject而不是普通的旧对象。

如果ExpandoObject无法满足您的需求,可以使用像http://clay.codeplex.com/

这样更强大的功能

===编辑===

如果我完全阅读这个问题,请帮助...

<trust legacyCasModel="true" level="Full" />添加到混合中会导致两者都失败并显示错误。

“legacyCasModel”强制使用非同类域,因为它是pre-.net4的处理方式。这意味着动态对象和旧CAS库不兼容。

我能看到的唯一有效的解决方法是将旧的CAS库抽象为run in a seperate application domain