首先;我永遠無法讓你的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