我想弄清楚的问题,我们一直在与RazorEngine 3.7.5及更高版本(3.7.7试过)RazorEngine 3.7.7 - 错误编译缓存模板
异常最近有当:
System.ArgumentException:请将模板管理器设置为模板或添加模板'MySolution.Billing.Templates.Layout.cshtml'!
它尝试使用Engine.Razor.Compile方法缓存模板时发生。
public void AddTemplate(string templateName, string source)
{
Engine.Razor.AddTemplate(templateName, source);
}
public void CacheTemplate(string templateName, Type type)
{
var templateKey = new NameOnlyTemplateKey(templateName, ResolveType.Layout, null);
Engine.Razor.Compile(templateKey, type);
}
当使用StructureMap创建包含它的服务时,将调用PreloadTemplates方法。每个模板都存储为嵌入式资源,并在使用RazorEngine编译后立即加载到RazorEngine缓存中,以确保所有模板的加载尽可能快。
private void PreloadTemplates()
{
var embeddedResources = Assembly.GetExecutingAssembly().GetManifestResourceNames().Where(x => x.StartsWith("MySolution.Billing.Templates")).ToList();
foreach (var invoiceResource in embeddedResources)
{
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(invoiceResource))
{
using (var reader = new StreamReader(stream))
{
var template = reader.ReadToEnd();
this._templatingService.AddTemplate(invoiceResource, template);
}
}
}
this._templatingService.CacheTemplate("MySolution.Billing.Templates.Header.cshtml", typeof(HeaderModel));
this._templatingService.CacheTemplate("MySolution.Billing.Templates.Layout.cshtml", typeof(LayoutModel));
this._templatingService.CacheTemplate("MySolution.Billing.Templates.Footer.cshtml", null);
}
RazorEngine配置如下
var config = new TemplateServiceConfiguration();
config.CachingProvider = new DefaultCachingProvider(t => { });
config.DisableTempFileLocking = true;
我们如何使用RazorEngine,应用
- WCF(InvoiceQueryFacade)
- Global.asax中的流动。 cs注册StructureMap注册表
- IInvoiceService(由StructureMap实例化提供一个InvoiceService)
- 服务调用PreloadTemplates在它的构造
步骤来重现
我们可以重现错误几乎每次都通过停止IIS并重新启动并重新启动g调用WCF方法。这似乎是回收应用程序池或停止IIS的问题,因为在WCF“热身”之后错误不会回来。