1. 程式人生 > >ASP.NET 網站預編譯概述

ASP.NET 網站預編譯概述

預設情況下,在使用者首次請求資源(如網站的一個頁)時,將動態編譯 ASP.NET 網頁和程式碼檔案。第一次編譯頁和程式碼檔案之後,會快取編譯後的資源,這樣將大大提高隨後對同一頁提出的請求的效率。

ASP.NET 還可以預編譯整個站點,然後再提供給使用者使用。這樣做有很多好處,其中包括:

  • 可以加快使用者的響應時間,因為頁和程式碼檔案在第一次被請求時無需編譯。這對於經常更新的大型站點尤其有用。

  • 可以在使用者看到站點之前識別編譯時 Bug。

  • 可以建立站點的已編譯版本,並將該版本部署到成品伺服器,而無需使用原始碼。

預編譯選項

ASP.NET 提供了兩個預編譯站點選項:

  • 預編譯現有站點。如果您希望提高現有站點的效能並對站點執行錯誤檢查,那麼此選項十分有用。

  • 針對部署預編譯站點。此選項將建立一個特殊的輸出,您可以將該輸出部署到成品伺服器。

另外,可以預編譯一個站點,使它成為只讀的或可以更新的站點。以下部分提供了有關每個選項的更多詳細資訊。

就地預編譯

您可以通過預編譯網站來稍稍提高網站的效能。對於經常更改和補充 ASP.NET 網頁及程式碼檔案的站點則更是如此。在這種內容不固定的網站中,動態編譯新增頁和更改頁所需的額外時間會影響使用者對站點質量的感受。

Note注意

預編譯現有站點可以高效地執行當使用者從您的站點請求頁時發生的同樣編譯過程。因此,主要的效能改進在於在第一次請求頁時無需對該頁進行編譯。

在執行就地預編譯時,將編譯所有 ASP.NET 檔案型別。(HTML 檔案、圖形和其他非 ASP.NET 靜態檔案將保持原狀。)預編譯過程的邏輯與 ASP.NET 進行動態編譯時所用的邏輯相同,說明了檔案之間的依賴關係。在預編譯過程中,編譯器為所有可執行輸出建立程式集,並將這些程式集放在 %SystemRoot%/Microsoft.NET/Framework/版本/Temporary ASP.NET Files 資料夾下的特殊資料夾中。隨後,ASP.NET 將通過此資料夾中的程式集來完成頁請求。

如果再次預編譯站點,那麼將只編譯新檔案或更改過的檔案(或那些與新檔案或更改過的檔案具有依賴關係的檔案)。由於編譯器的這一優化,因此,即使是在細微的更新之後也可以編譯站點。

針對部署的預編譯

預編譯站點的另一個用處是生成可部署到成品伺服器的站點的可執行版本。針對部署進行預編譯將以佈局形式建立輸出,其中包含程式集、配置資訊、有關站點資料夾的資訊以及靜態檔案(如 HTML 檔案和圖形)。

編譯站點之後,可以使用 Windows XCopy 命令、FTP、Windows 安裝等工具將佈局部署到成品伺服器。佈局在部署完之後將作為站點執行,且 ASP.NET 將通過佈局中的程式集來完成頁請求。

針對部署預編譯站點為您的原始碼和其他智慧財產權提供了保護措施。有關編譯器在針對部署的編譯過程中如何處理檔案的更多資訊,請參見針對部署的站點編譯過程中的檔案處理

您可以按照以下兩種方式來針對部署進行預編譯:僅針對部署進行預編譯,或者針對部署和更新進行預編譯。

僅針對部署進行預編譯

當僅針對部署進行預編譯時,編譯器實質上將基於正常情況下在執行時編譯的所有 ASP.NET 原始檔來生成程式集。其中包括頁中的程式程式碼、.cs 和 .vb 類檔案以及其他程式碼檔案和資原始檔。編譯器將從輸出中移除所有原始碼和標記。在生成的佈局中,為每個 .aspx 檔案生成編譯後的檔案(副檔名為 .compiled),該檔案包含指向該頁相應程式集的指標。

要更改網站(包括頁的佈局),必須更改原始檔案,重新編譯站點並重新部署佈局。唯一的例外是站點配置;您可以更改成品伺服器上的 Web.config 檔案,而無需重新編譯站點。

此選項不僅為您的頁提供了最大程度的保護,還提供了最佳啟動效能。

針對部署和更新進行預編譯

當針對部署和更新進行預編譯時,編譯器將基於所有原始碼(單檔案頁中的頁程式碼除外)以及正常情況下用來生成程式集的其他檔案(如資原始檔)來生成程式集。編譯器將 .aspx 檔案轉換成使用編譯後的程式碼隱藏模型的單個檔案,並將它們複製到佈局中。

使用此選項,可以在編譯站點中的 ASP.NET 網頁之後,對它們進行有限的更改。例如,可以更改控制元件的排列、頁的顏色、字型和其他外觀元素。您還可以新增不需要事件處理程式或其他程式碼的控制元件。

當站點第一次執行時,為了從標記建立輸出,ASP.NET 將執行進一步的編譯。

Note注意

預編譯的可更新網站不允許多個頁引用相同的 CodeFile 類。

預編譯子應用程式

預編譯網站只是對該站點進行編譯,而不會編譯所有子站點。如果網站包含在 IIS 中標記為應用程式的子資料夾,則當預編譯父資料夾時,不會編譯子應用程式。

執行預編譯

請參見