有經驗的 .NET 開發人員大都會知道第一次瀏覽網站的時候都會很慢(第一個人是倒楣鬼),因為 ApplicationPool 必須要有請求才會活起來
為了閃掉這個問題,可透過腳本定期瀏覽不要讓人家發現這個問題
在 IIS 8 之後 (IIS 7 要另外處理),就可以直接設定 Application Initialization (Preload),讓 IIS 自己當第一個人瀏覽網站,以下分享我的作法
開發環境
- Windows 2012 R2/IIS8.5
- .NET Framework 4.6.1
專案設定
- 專案型態是 Project 而非 WebSite
IIS 安裝 Application Initialization
IIS8 以上從 新增角色及功能精靈上安裝
設定應用程式集區
Managed 管線模式→整合式
進階設定→啟動模式→AlwayRunning
站台設定
進階設定→預先載入已啟用
應用程式集區"停止後再啟動或是"回收"才會載入預設頁面;站台重新啟動不會載入預設頁面
我的自動化部署腳本會更新 Web.Config,觸發站台重新啟動,程式集區不會回收,可以調用 msdeploy.exe 進行網站回收,參考以下:
https://forums.iis.net/t/1161700.aspx?Recycle+App+Pool+Using+MSDeploy
https://forums.iis.net/t/1161700.aspx?Recycle+App+Pool+Using+MSDeploy
初始化路徑
<system.webServer>
<applicationInitialization doAppInitAfterRestart="true">
<add initializationPage="/swagger"/>
</applicationInitialization>
</system.webServer>
這裡面的文件或路徑要排除驗證
範例如下
<location path="Default.aspx">
<system.web>
<authorization>
<allow users="*,?" />
</authorization>
</system.web>
</location>
驗證方式
- 網站第一次的請求會觸發 Global.asax 的 Application_Start 事件,可以在這裡寫個 Log 觀察
- 在應用程式集區,針對你的應用程式按下回收,在工作管理員會出現兩個應用程式的 w3wp.exe process,它們在那邊搬記憶體資料,完成後只會留下一個 w3wp.exe,如下圖所示
IIS 7 的設定
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET