.NET Core 2.0 WebApi使用RazorLight遇System.TypeLoadException问题
问题描述
我正在尝试在邮件模板中使用Razor语法,参考了Microsoft Code的Razorlight教程实现了一个静态辅助类来获取模板,代码如下:
public static string GetTraderApplicationDeletedTemplate(Trader trader) { string templatePath = $@"{Directory.GetCurrentDirectory()}\EmailTemplates"; IRazorLightEngine engine = EngineFactory.CreatePhysical(templatePath); string result = engine.Parse("TraderDeletedEmail.cshtml", trader); return result; }
调试时,engine.Parse方法抛出了无详细信息的System.TypeLoadException,我已经确认templatePath和.cshtml文件名都是有效的,想请教各位可能的故障原因是什么?
根据我使用RazorLight的实战经验,这种无详细信息的TypeLoadException通常和以下几个原因有关,你可以逐一排查:
依赖版本不兼容:RazorLight对.NET版本和配套的ASP.NET Core Razor组件有严格的版本匹配要求。比如你用了.NET 7但安装的是旧版RazorLight,就可能出现类型加载失败。建议打开NuGet包管理器,检查RazorLight的版本,尝试升级到和你项目目标框架适配的最新稳定版;如果是.NET Framework项目,选择对应兼容的版本。
模板内的类型引用错误:你的
TraderDeletedEmail.cshtml模板里如果用到了某些未正确引入的类型(比如自定义扩展方法、第三方类库),RazorLight在编译模板时找不到对应的类型,就会抛出这类异常。可以打开模板文件,检查所有@using指令是否齐全,用到的类型所在的程序集是否已经被项目引用。文件权限或临时目录问题:虽然你确认了模板路径有效,但RazorLight编译模板时会生成临时文件到系统临时目录(默认是
%TEMP%\RazorLight),如果当前程序的运行权限不足(比如IIS应用池权限过低),可能导致临时文件无法写入或读取,进而引发类型加载失败。你可以尝试手动指定一个程序有权限访问的缓存目录,或者给默认临时目录添加读写权限。重复依赖冲突:如果你的项目中同时引用了多个版本的Razor相关程序集(比如
Microsoft.AspNetCore.Razor.Runtime存在两个版本),会导致类型加载冲突。可以在NuGet包管理器的“已安装”标签里检查重复的依赖,卸载多余的版本,确保所有相关包版本一致。编译缓存损坏:RazorLight会缓存编译好的模板,有时候缓存文件损坏会导致加载异常。你可以手动删除
%TEMP%\RazorLight目录下的所有文件,然后重新运行程序,让RazorLight重新编译模板。
内容的提问来源于stack exchange,提问作者Matthew Flynn

