避免VBCSCompiler对Roslyn驱动的ASP.NET Razor MVC视图的影响?

为了在MVC5的Razor视图中支持C#6,我们通过web.config打开了Roslyn编译器平台:

     

但是,在生产部署之后,每个视图/控制器似乎都有明显的“第一次加载”延迟,这比没有启用此编译器时更糟糕。

重要的是,此延迟是您从部署的新站点获得的常规JIT延迟的补充。 页面显然较慢,而VBCSCompiler.exe似乎在后台运行以“进一步编译”这些页面。

是否有预编译/优化此情况的最佳实践,以消除部署后的首次加载运行时延迟? 理想情况下,VBCSCompiler.exe在部署发生后未运行,并在构建时执行。

我已经看到了aspnet_compiler.exe的提及,并遇到了StackExchange.Precompilation(请参阅https://blog.stackoverflow.com/2015/07/announcing-stackexchange-precompilation/ ),并想知道这是否是正确的修复程序。

有没有人对这个特殊问题有任何经验? 谢谢。

您可以使用StackExchange.Precompilation中的RoslynRazorViewEngine :

 ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new RoslynRazorViewEngine()); 

然而,这个视图引擎的主要目标 不是摆脱启动性命中。 有了它,你只需要C#6支持。 仍然必须在第一次加载时编译视图,但之后roslyn程序集最终在app域中,并且您获得更高的内存占用。 由于在应用程序中调用了roslyn,因此您无需Web服务器上的特殊权限即可从/bin文件夹中执行另一个.exe 。 我们主要使用它来开发我们的开发机器。

我强烈建议您只预编译所有视图 。 这样您就不会获得启动性命中,并且您可以获得视图的编译时validation。 您甚至可以在生成的视图代码上运行分析器。 这就是StackOverflow目前在生产中运行的内容。

我在aspnet_compiler.exe博文中提到了aspnet_compiler.exe ,因为它是ASP.NET上预编译的原始工具(没有MVC)。 不幸的是,这很慢。

如果Roslyn编译器程序集不是NGen,则可能需要一些时间来启动VBCScompiler.exe(它引用了几个大型托管程序集,并且JIT它们需要时间)。 为了减少JIT周期,您可以NGEN机器上的所有Rsolyn组件。 您也可以从此博客中找到一些帮助信息。