[ASP.NET] 解決網站的第一次請求很慢 - PreComplier

根據預設,在使用者首次要求資源時 (例如要求網站的頁面),會動態編譯 ASP.NET Web 網頁和程式碼檔。在頁面與程式碼檔案初次編譯之後,就會快取編譯過的資源。因此,後續對相同頁面的要求就會非常有效率。 出自:https://msdn.microsoft.com/zh-tw/library/bb398860(v=vs.110).aspx

根據預設,Web 應用程式專案中的程式碼檔可藉由使用 Microsoft Build Engine (MSBuild) 而先行編譯成單一組件。 ASP.NET Web 網頁 (.aspx)、使用者控制項 (.ascx) 及 MVC Razor 檢視 (.cshtml and .vbhtml) 則會由 ASP.NET 編譯器在伺服器上進行動態編譯。 您還可以選擇先行編譯網頁、使用者控制項及 Razor 檢視。 出自:https://msdn.microsoft.com/zh-tw/library/aa983464(v=vs.110).aspx

我消化後:預設,第一次會動態編譯請求頁面,然後放到 Cache 裡面;使用 PreComplier 後,就不會再次編譯,也是會放到 Cache 裡面

開發環境

  • Windows 2012R2
  • VS2015 Update3
  • Web Application Project

ASP.NET 提供了兩種先行編譯

  1. 就地先行編譯網站 :網站仍維持其檔案和目錄結構。
  2. 針對部署先行編譯網站:程式碼都會變成 *.complier 檔案。

請依以下資料選擇你需要的先行編譯方式:
https://msdn.microsoft.com/zh-tw/library/bb398860(v=vs.110).aspx

先行編譯策略

我實測了以下幾種實作方式:


ASP.NET 編譯工具 (Aspnet_compiler.exe)

.NET Framework 會安裝在 %windir%\Microsoft.NET\Framework\version ,選擇正確的版本

語法

aspnet_compiler -p physicalOrRelativePath -v / targetPath

targetPath:輸出位置,路徑是 physicalOrRelativePath 的子目錄,也可以用 -f 取代

針對部署先行編譯網站語法:
%windir%\Microsoft.NET\Framework64\v4.0.30319\Aspnet_compiler -p "C:\inetpub\source" -v / -f "C:\Staging
執行結果:#結果

就地先行編譯網站語法:
%windir%\Microsoft.NET\Framework64\v4.0.30319\Aspnet_compiler -p "C:\inetpub\source" -v / -u -f "C:\Staging
執行結果:#結果

更多的資源請參考:
https://msdn.microsoft.com/zh-tw/library/ms229863(v=vs.100).aspx

Publish Web at VS2015

發行時把 Precompile 打勾

發行設定就會在以下目錄

 

結果

在 bin 裡面只有少數幾個 *.complied,其餘的前端頁面維持

同等於 aspnet_compiler -u 指令
在 Glimpse 的 Cache 看不到頁面緩存的資訊,不知道東西到哪裡了

MsBuild at TFS 2015

使用 /p:PrecompileBeforePublish=true

/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(Build.ArtifactStagingDirectory)\\WebPackage\\$(BuildConfiguration)" /p:PrecompileBeforePublish=true

我把這段放到 TFS 上

PrecompileBeforePublish 屬性是我從 *.pubxml 找到的,我在網路上找不到該屬性的說明頁面

 

結果

bin 多了好多 *.compiled 的檔案

專案內的 *.cshtml、*.asmx、*.ashx、*.aspx 的內容被移到 bin/某個 *.compiled 裡面了

 

使用Glimpse觀察,頁面真的在第一次瀏覽的時候會放到 Cache 裡面,過期策略用 Sliding 60000s

 

結論

明明都是 MsBuild /p: PrecompileBeforePublish 為什麼出來的結果不一樣,找不到文件

使用了"針對部署先行編譯網站",真的讓我的網站在使用者第一次訪問的時候變快了

使用了"針對部署先行編譯網站",更新網頁時就會有限制;我透過 CI 自動化部署,就沒有更新部分網頁這件事

 

參考資源

ASP.NET Web Application Project Precompilation Overview

ASP.NET 先行編譯概觀

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


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

Image result for microsoft+mvp+logo