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 一次,就完成預熱的程序。
應用程式初始化(Application Initialization)
有關於應用程式初始化,就參考微軟官方的說明,我們在這邊就直接動手在 Web.Config 加入以下設定,讓 Web 應用程式在啟動時對 /WarmUp 發出請求。
我們來比較一下有無預熱的結果,原先在 Web 應用程式完成啟動後,首頁下載完成的時間為 1.94s,在預熱之後減少到 78ms,可以看出 View 的初次渲染真的很花時間。
但是這個會拉長 Web 應用程式啟動的時間,不過我們可以透過升級 Azure App Service 方案至少到 S 等級,然後部署我們的 Web 應用程式到預備位置,預熱完成之後再自動交換到 Production 環境來避開此問題。