1. 程式人生 > >預熱ASP.NET MVC 的View

預熱ASP.NET MVC 的View

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,它們三個會被編譯在同一個元件。

應用程式初始化(​​Application Initialization)

有關於應用程式初始化,就參考微軟官方的說明,我們在這邊就直接動手在Web.Config加入以下設定,讓Web應用程式在啟動時對/WarmUp發出請求。

 

我們來比較一下有無預熱的結果,原先在Web 應用程式完成啟動後,首頁下載完成的時間為1.94s,在預熱之後減少到78ms,可以看出View 的初次渲染真的很花時間。

但是這個會拉長Web 應用程式啟動的時間,不過我們可以透過升級Azure App Service 方案至少到S 等級,然後部署我們的Web 應用程式到預備位置,預熱完成之後再自動交換到Production 環境來避開此問題。