欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

预热ASP.NET MVC 的View

程序员文章站 2022-03-24 11:15:17
ASP.NET MVC 的View 预设是Load on Demand(按需加载),也就是说View 第一次要Render 的时候才会去载入跟编译,这个就会造成一个现象,即使Web 应用程式已经完成启动,在浏览页面的时候也是会感觉到一点延迟,尤其Web 应用程式部署在Azure App Servic ......

asp.net mvc 的view 预设是load on demand(按需加载),也就是说view 第一次要render 的时候才会去载入跟编译,这个就会造成一个现象,即使web 应用程式已经完成启动,在浏览页面的时候也是会感觉到一点延迟,尤其web 应用程式部署在azure app service 上更为明显,既然这样,那我们就在web 应用程式启动时候,把所有view 载入跟编译,然后render 一次就行了,我们来看看怎么做?

要render 一个页面有时候还会牵扯到一些外部资源(database、file...等),这个就不在讨论范围,我们只单纯关注view 的部分,我会以asp.net mvc 的范本专案来当做我的范例,使用的azure app service 方案是b1。

新增预热用的action

这个预热用的action 可以随意看要新增在哪个controller 底下,不一定要是与预热的view 有相关的controller,为了看出有无预热的差异,在这边我新增一个warmupcontroller 放置预热的程式码,接下来我们就去找出我们web 应用程式底下所有的view,然后透过viewengine 把它们逐一render 一次,就完成预热的程序。

view 的编译并不是一个档案编译成一个组件,而是一个目录编译成一个组件,举例来说,~/views/home/ 底下有三个.cshtml 档案:contact.cshtml、index.cshtml、about.cshtml,它们三个会被编译在同一个组件。

预热ASP.NET MVC 的View

应用程式初始化(​​application initialization)

有关于应用程式初始化,就参考微软官方的说明,我们在这边就直接动手在web.config加入以下设定,让web应用程式在启动时对/warmup发出请求。

预热ASP.NET MVC 的View

 

我们来比较一下有无预热的结果,原先在web 应用程式完成启动后,首页下载完成的时间为1.94s,在预热之后减少到78ms,可以看出view 的初次渲染真的很花时间。

预热ASP.NET MVC 的View

但是这个会拉长web 应用程式启动的时间,不过我们可以透过升级azure app service 方案至少到s 等级,然后部署我们的web 应用程式到预备位置,预热完成之后再自动交换到production 环境来避开此问题。