首先;我永远无法让你的GitHub代码运行。以下是基于我自己的复制代码。
我认为你要无法加载文件或程序集 -exceptions因为当你设置了沙箱的AppDomain你设置:
adSetup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
这不会在ASP.NET工作因为程序集位于bin
子文件夹中。要解决这个问题,只需做到这一点:
adSetup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase
+ "\\bin";
但是,ASP.NET将默认shadow copy assemblies。因此,只是进行此更改可能会导致另一个异常:
ArgumentException:对象类型无法转换为目标类型。
这是因为在默认应用程序域和沙箱中加载的程序集之间存在混淆。默认应用程序域中的那些位于临时卷影副本位置,沙盒中的那些位于Web应用程序根目录的bin文件夹中。
解决这个问题的最简单的方法是将<system.web>
下面的这行的你的web.config禁用阴影复制:
<hostingEnvironment shadowCopyBinAssemblies="false"/>
此外,我认为跳过使用RazorDynamicObject
会更好,更容易,并用[Serializable]
来标记模型。事实上,我从来没有得到RazorDynamicObject
正常工作。
这个答案的其余部分总结了我做什么得出这样的结论
我认为,这是由于RazorEngine错误或限制。
(我不太知道这个了,这很可能是那个影子复制和RazorDynamicObject
不能一起工作)
我已经花了几个小时试图找出如何得到这个工作,但我总是以RazorEngine抛出的安全异常结束。
但是,有一种可能的解决方法:沟RazorDynamicObject
并将您的模型类标记为可序列化。
[Serializable]
public class ContentModel
{
public string Html { get; set; }
public string Title { get; set; }
public EditHistory History { get; set; }
}
[Serializable]
public class EditHistory
{
public IReadOnlyCollection<UserDetail> Authors { get; set; }
}
[Serializable]
public class UserDetail
{
public string Name { get; set; }
public string EmailAddress { get; set; }
}
,做:
Razor.Run("default.cshtml", typeof(ContentModel), cm); // no RazorDynamicObject
我不能让你的摄制代码的运行,所以我创建了自己的基于您的代码:
创建新的控制台应用程序(Visual Studio)
在包管理器控制台,运行:install-package razorengine
复制代码从您的摄制:
用[Serializable]
标记模型。
删除RazorDynamicObject
为了确保我们真的可以使从作者列表中的用户信息,改变测试模板:
string template = "@Model.History.Authors[0].EmailAddress";
此外,为了使该模板的工作,改变Authors
in EditHistory
from IReadOnlyCollection<>
to IReadOnlyList<>
我创建了GIST,生成代码:
https://gist.github.com/mwikstrom/983c8f61eb10ff1e915a
这对我有用。正如它应该那样打印[email protected]
。
ASP。NET会默认影射副本程序集,这会导致沙盒问题。
要获得ASP.NET的这种工作,你就必须做到以下几点变化:
禁用ASP.NET阴影复制加入<system.web>
下,按照Web.config文件:
<hostingEnvironment shadowCopyBinAssemblies="false"/>
将\bin
附加到沙箱的应用程序基路径。因此,在createRazorSandbox(...)
做:
adSetup.ApplicationBase =
AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "\\bin";
我测试了这一点,它工作得很好。我的测试项目很简单:
https://gist.github.com/mwikstrom/ea2b90fd0d306ba3498c
这里有列出的其他替代品(除了禁用阴影复制):
https://github.com/Antaris/RazorEngine/issues/224
如果更换'公共EditHistory历史发生了什么{获取;集;}'和'公共IReadOnlyCollection历史{get; set;}'并且也使用简单类型'public IReadOnlyCollection History {get; set;}'?只读集合是否会成为问题?如果你使用“IList”或“IEnumerable”呢?相同的结果? –
Tommy
任何机会,你可以把一个简单的VS项目放在一起,重现这个问题并在某处发布(例如GitHub)? –
@CaioProiete - 好主意。我有一种感觉,并不是很多人会熟悉这个特定的模块。我不是,但很好奇追查究竟是什么导致失败(嵌套复杂类型,只读集合等) – Tommy