[IIS 8] 解決網站的第一次請求很慢 - 設定 Application Initialization (Preload)

有經驗的 .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

 

初始化路徑

  <system.webServer>
    <applicationInitialization doAppInitAfterRestart="true">
      <add initializationPage="/swagger"/>
    </applicationInitialization>
  </system.webServer>
這裡面的文件或路徑要排除驗證

範例如下

<location path="Default.aspx">
    <system.web>
      <authorization>
        <allow users="*,?" />
      </authorization>
    </system.web>
</location> 

 

參考
https://docs.microsoft.com/en-us/iis/get-started/whats-new-in-iis-8/iis-80-application-initialization
 

驗證方式

  • 網站第一次的請求會觸發 Global.asax 的 Application_Start 事件,可以在這裡寫個 Log 觀察
  • 在應用程式集區,針對你的應用程式按下回收,在工作管理員會出現兩個應用程式的 w3wp.exe process,它們在那邊搬記憶體資料,完成後只會留下一個 w3wp.exe,如下圖所示

IIS 7 的設定

让IIS 7 如同IIS 8 第一次请求不变慢

 

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo