Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在RazorEngine中使用相同的密钥在更新的模板上运行Complie?_C#_Asp.net Web Api2_Razorengine - Fatal编程技术网

C# 如何在RazorEngine中使用相同的密钥在更新的模板上运行Complie?

C# 如何在RazorEngine中使用相同的密钥在更新的模板上运行Complie?,c#,asp.net-web-api2,razorengine,C#,Asp.net Web Api2,Razorengine,现在,我将现有模板更新为如下所示。我从数据库中获取模板 string template = "Hello @Model.Name, welcome to RazorEngine!"; var result = Engine.Razor.RunCompile(template, "templateKey", null, new { Name = "World" }); 每当我这样做时,我会得到一个错误,相同的密钥已经用于另一个模板 解决此问题的最佳方法是什么?问题在于您没有使用传递的模板代码所特

现在,我将现有模板更新为如下所示。我从数据库中获取模板

string template = "Hello @Model.Name, welcome to RazorEngine!";
var result = Engine.Razor.RunCompile(template, "templateKey", null, new { Name = "World" });
每当我这样做时,我会得到一个错误,相同的密钥已经用于另一个模板


解决此问题的最佳方法是什么?

问题在于您没有使用传递的模板代码所特有的模板密钥。RazorEngine缓存模板并编译它们,以便下次运行时更快

string template = "Hello @Model.Name, welcome to My World!";

每个模板都应该有自己的唯一密钥,。检查模板是否已与Engine.Razor.IsTemplateCached一起使用,如果模板已经存在,请使用Run而不是RunCompile。@DavidG如果您能给我一个这样的示例,那就太好了。请参阅此以了解上下文-即使我更新了模板。当我第二次运行它时,它仍然使用缓存模板。我正在使用LINQPad 4测试此问题。如果更新模板,则需要一个新密钥-这是另一个模板。无法清除RazorEngine中的缓存,因为它们被编译为程序集,并且无法卸载程序集。您可以通过使用一个新的引擎实例来解决这个问题:var engine=RazorEngineService.Create;引擎。运行编译。。。;但这不会释放以前模板的内存。这意味着每次更新模板时,我都需要创建一个新密钥并再次编译它。我无法从缓存中删除旧模板。我是这么说的,是的。清除缓存的唯一方法是重新启动AppDomain。我找到了此链接。我更新了代码以使用MyTemplateManager,它运行良好。我不确定它是每次都创建新密钥还是使用相同的密钥并更新新模板。var config=新的TemplateServiceConfiguration;config.Debug=true;config.TemplateManager=新的MyTemplateManagertemplate;Engine.Razor=RazorEngineService.Createconfig;Engine.Razor.RunCompiletemplate,null,viewModel.Dump;我可以使用相同的密钥更新模板。
var helloTemplate = "Hello @Model.Name";

string result;
var model = new { Name = "World" };

//Has the template already been used? If so, Run without compilation is faster
if(Engine.Razor.IsTemplateCached("helloTemplate", null))
{
    result = Engine.Razor.Run("helloTemplate", null, model);
}
else
{
    result = Engine.Razor.RunCompile(helloTemplate, "helloTemplate", null, model);
}