自從ASP.NET面市以來,開發人員一直都在要求(微軟)出台一個解決辦法,而ASP.NET 2.0利用先行編譯提供了一個有效解決方案。
先行編譯選項
在初次開機應用程式的時候,ASP.NET會動態地分析和編譯所有的ASP.NET檔案(aspx頁面)。運行環境要對編譯的結果進行緩衝,以便更好地服務未來所有的請求。
在伺服器重啟或者Web伺服器重啟之後,第一次啟動應用程式也意味著這一過程要重新開始。而且,對應用程式任何檔案的改變都會被系統檢測到,而在檔案發生改變之後首次運行應用程式也會讓這一過程再次發生。
很多Web開發人員都很討厭這種初始化延遲。而先行編譯通過(預先)編譯應用程式避免了這種延遲。
命令列
通過安裝在.NET架構2.0裡的aspnet_compiler.exe程式就能夠啟動先行編譯。它位於架構安裝目錄下(版本號碼會根據安裝的架構的版本而有所不同)。下面就是這個程式預設的路徑:
C:\\\\Microsoft.NET \\Framework\\v2.0.5072\\aspnet_compiler.exe
您可以用-?這個命令參數查看該程式的所有參數列表,下面我就解釋一下一些可用的參數:
m:這個參數表示您將使用完整的、應用程式將被先行編譯的IIS中繼資料庫路徑。IIS中繼資料庫的路徑是/LM/W3SVC/1/Root/應用程式名稱。
v:使用需要先行編譯Web應用程式的虛擬IIS路徑。虛擬路徑的格式是:/應用程式名稱。
p:使用需要先行編譯Web應用程式的物理IIS路徑。它是包括磁碟機名和指嚮應用程式目錄的完整路徑。舉個例子c:\\inetpub\\wwwroot\\應用程式名稱。v這個參數必須和p一起用,所以編譯器能夠解析任何應用程式的根參考。
f:表示目標目錄是否要被覆蓋。
u:用來設定先行編譯完的應用程式是可以更新的。這表示所有的標記檔案(ASPX、ASCX等等)都可以在目標目錄裡進行更新。
targetDir:用於先行編譯應用程式檔案的目標目錄。下面的命令用虛擬路徑和指定的目標路徑先行編譯了一個應用程式:aspnet_compiler.exe –v /應用程式名稱 c:\\目標目錄名。
如果沒有指定目標目錄,那麼結果檔案會被放在ASP.NET的臨時檔案目錄裡,就像在ASP.NET運行庫在首次調用應用程式的時候處理編譯一樣。臨時目錄預設的路徑如下:
c:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727\\Temporary ASP.NET Files\\應用程式名稱
先行編譯另外一個好處是能夠捕捉在應用程式啟動階段發生的任何錯誤。錯誤會顯示在工具裡,但是不會終止編譯過程。
隱藏原始碼
先行編譯的另外一個副產品是能夠隱藏任何或者所有的應用程式原始碼。這意味著其他的開發人員需要利用反編譯器或者ilasm才能夠取得您的代碼。這就行了——先行編譯讓您能夠以二進位檔案的形式分發應用程式。
目標目錄裡沒有原始碼。App_Code檔案夾裡的所有類都被編譯成一個或者多個二進位檔案,放到bin目錄下;目標目錄下不會有原始碼檔案(.cs、.vb、.js等等)。此外,所有的首頁面檔案也會被編譯到bin目錄下,作為隱藏檔案。 ASPX、ASCX和ASHX檔案的所有代碼和標記,以及相關的程式碼後置檔案都被放在bin目錄下的一個或者多個程式集裡。
隱藏原始碼是毀譽參半。其他的開發人員無法以任何形式查看或者更改應用程式——即使是Web頁面標記也不行。而另外一方面,對應用程式的任何改變(不論大小)都要求改變原始的原始碼、重新編譯和重新部署。這可能是一個十分耗時的過程,所以並不一定適用於所有的應用程式。
可更新命令參數(u)讓您能夠取代這個預設的行為。使用這個參數意味著所有的標記檔案 (ASPX、ASCX等等)都要包括在先行編譯過程的輸出裡。一旦應用程式被部署,這些檔案仍然能夠用於編輯和更新。在應用程式被應用之後,小的布局問題可以通過源檔案來處理,所以這是一個非常理想的參數。
Visual Studio的支援
在使用Visual Studio 2005開發基於ASP.NET的應用程式時,先行編譯是可選的。“發布Web網站(Publish Web Site)”菜單選項讓您能夠把網站作為一個先行編譯應用程式推到另一個位置。此外,上面還有一個複選框讓您設定可更新選項。
總結
ASP.NET 2.0的先行編譯選項讓您能夠先行編譯Web應用程式,以避免(像一般編譯一樣)首次調用應用程式的延遲。此外,它還提供了一定的安全性,因為程式的原始碼在結果中是不可見的,所有的內容檔案都可以被隱藏。