ASP.NET MVC5每个Razor页面在首次加载时非常缓慢

28

这不是第一个请求到达时遇到的相同延迟体验,而是每次访问基于Razor的视图时都会经历的延迟,可能需要一两秒钟的时间。对该视图的所有后续请求都非常快。即使是不进行任何编程工作(例如访问数据库等)的简单视图也会发生这种情况。

我已经确保在配置文件中的system.web下的编译标记中debug=false

我还通过Global.asax将Razor设置为唯一的视图引擎。

是什么导致了这种延迟? 这似乎是在将ASP.NET从“网站”迁移到“Web应用程序”之前所遇到的问题,在那里,每个.aspx.cs代码后台在部署时编译而不是在运行时编译。 Razor是否仍然存在这个问题?

3个回答

38

这个问题是由 Razor 视图的解析和编译引起的。一旦视图被编译,它们会非常快地执行。视图仅在第一次请求视图时解析和编译,或者如果视图自上次编译以来已更改。

您可以通过在发布过程中将视图预编译来解决在部署的 WebApp 上的此问题。请参阅下面的图片,了解如何在 VS2012 中使用标准发布对话框执行此操作。

如果您愿意,可以选择可更新选项,但对于生产网站,我不建议这样做。

enter image description here


8
这对我的网站没有影响。每个页面仍然加载非常慢。 - user2444499
1
@user2444499,“允许预编译站点可更新”设置必须关闭,以便对视图进行预编译。默认情况下它是开启的。 - Ryan
@Ryan 不管怎样都不行。我可以在bin中看到已编译的视图dll,但初始渲染仍然像以前一样需要很长时间。正在运行VS2013,编译为64位。 - Aurimas Neverauskas
1
对我有效的方法是删除System.Web.Optimization和WebGrease。这也意味着要删除所有的css和脚本绑定组件,但是页面加载速度更快,它们几乎是瞬间完成的。很遗憾这些NuGet包默认被包括在内。 - Xav
@Ryan 是正确的。我取消了“允许预编译站点可更新”选项,哇,它的表现好多了,甚至在开发环境下也是如此! - petrosmm
显示剩余2条评论

5

Webgrease是一个可以在首次加载时将生产环境中的js和css捆绑包进行缩小处理,然后进行缓存的工具。问题在于当缩小处理出现错误时,它会尝试再次编译,运行其中的任何错误例程。

没有错误报告,发现这种情况唯一的方法是直接打开引用并查看类似以下内容:

/* Minification failed. Returning unminified contents.
(69,1): run-time error CSS1019: Unexpected token, found '@import'
(69,9): run-time error CSS1019: Unexpected token, found '"variables.less"'
(70,1): run-time error CSS1019: Unexpected token, found '@import'

在上面的例子中,这意味着您不必要的.less或.sass文件已经被发布了 - 这通常是通配符捆绑的结果。通配符捆绑会浪费更多的时间,而不会节省时间。

1

解析视图可能会很慢。您尝试过使用RazorGenerator编译您的视图吗?

在NuGet包管理器控制台中键入install-package RazorGenerator,或通过NuGet手动在此处安装它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接