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

Posted

技术标签:

【中文标题】ASP.NET MVC5 每个 Razor 页面在第一次加载时非常慢【英文标题】:ASP.NET MVC5 each Razor Page very slow on first load 【发布时间】:2014-09-20 07:39:16 【问题描述】:

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

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

我还通过 Global.asax 删除了 set Razor 作为唯一的视图引擎

什么可能导致这种延迟? 这似乎是在旧的 asp.net“网站”中遇到的问题,然后它才转移到每个 .aspx.cs 代码隐藏所在的“Web 应用程序”中在部署而不是运行时编译。 Razor 还受此困扰吗?

【问题讨论】:

【参考方案1】:

该问题是由 Razor 视图的解析和编译引起的。编译视图后,它们会非常快速地执行。只有在第一次请求视图时,或者在上次编译后视图已被修改时,才会解析和编译视图。

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

如果您愿意,可以选择可更新选项,但对于生产站点,我不推荐它。

【讨论】:

谢谢 - 现在看起来很明显。我已经尝试过了,似乎取得了显着的进步,与之前的延迟相比,仍然存在滞后但没有任何变化。它还暴露了 VS2013 中的一个错误,它运行 32 位编译器而不是所需的 64 位编译器,一旦我解决了它就可以工作。 这对我的网站没有任何影响。每个页面的加载速度仍然很慢。 @user2444499 “允许预编译的站点可更新”设置必须设置为关闭才能预编译视图。默认开启, @Ryan 无论如何它都不起作用。我可以在 bin 中看到已编译的视图 dll,但初始渲染仍然需要和以前一样长的时间。运行VS2013,编译为64位。 对我有用的是删除 System.Web.Optimization 和 WebGrease。这还需要为您的 css 和脚本删除所有捆绑组件,但是神圣的莫利确实页面加载速度更快,它们几乎是即时的。可惜这些 NuGet 包默认包含在内。【参考方案2】:

网络油脂。它会在首次加载时缩小您的生产 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 文件已发布 - 这通常是通配符捆绑的结果。 通配符捆绑花费的时间多于节省的时间。

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于ASP.NET MVC5 每个 Razor 页面在第一次加载时非常慢的主要内容,如果未能解决你的问题,请参考以下文章

在哪里放置小部件的脚本引用(部分页面)

验证错误时 ASP.NET MVC5 textarea 未以红色标出

Asp.Net Core 上的 Razor 页面 - 添加了 Razor 页面但无法让页面显示

请问:ASP.net mvc5和asp.net.core有啥区别呢?在今后的发展中这个前景怎么样?

Razor 页面简化了 ASP.NET MVC 应用程序

覆盖 asp.net core razor 页面中的 razor 视图