ASP.NET的編譯方法
第一種:默認編譯
默認編譯就意味著無需對ASP.NET應用程序執行任何手動編譯。在這種情況下ASP.NET 運行庫將在Web瀏覽器首次請求應用程序中的頁時編譯web應用程序,隨后服務器將編譯后的結果存儲到%SystemRoot%"Microsoft.NET"Framework"version"Temporary ASP.NET Files文件夾下的特殊文件夾中,隨后的請求只實例化此文件夾中已經創建的DLL,該DLL發送響應請求。如果對應用程序中的文件進行了更改,則在下次請求頁時,ASP.NET 運行庫將確定已更改的文件的依賴項,并且僅重新編譯受更改影響的文件。
優點:
1、簡單易用。部署網站時,只須將寫好的網站源碼復制到web服務器上就行,ASP.NET 編譯器會為您完成所有工作。
2、當預編譯網站所需的額外步驟減慢了開發過程時,默認編譯是開發過程中可供選擇的最佳編譯模型。
缺點:
1、首次請求網站時可能會有很大延遲。
2、要就將源代碼文件放在web服務器上。
3、對服務器上的網站目錄擁有文件系統訪問權限的任何人都可以獲取源代碼和 UI 代碼。
疑問:
在郝剛老師的《ASP.NET2.0開發指南》第三章,第三節:編譯和運行應用程序中這樣寫到“默認情況下,用戶首次請求資源(例如本例中的Default.aspx)時,將動態編譯ASP.NET頁面(Default.aspx)和代碼隱藏文件(Default.aspx.cs)。在第一次編譯頁和代碼文件之后,服務器將自動緩存編譯后的結果,這樣將大大提高隨后對同一頁提出的請求的效率”,我理解的上面這段話的意思是:用戶首次請求頁面a,服務器編譯頁面a,而不會編譯頁面b。這時只有頁面a的請求效率得到了提高,隨后用戶首次請求頁面b,服務器才編譯頁面b,這樣頁面b的請求效率才得到提高。而微軟msdn網頁上說的是“首次請求時編譯web應用程序”。這點我感覺郝剛老師寫錯了,幾次試驗的結果都證明是首次請求網頁就會編譯整個web應用程序。
第二種:就地預編譯
我感覺就地預編譯就是手動完成了在默認預編譯中的瀏覽器首次請求的功能,也就是用下面的命令來代替首次請求觸發編譯,它和默認編譯的差別很小,唯一的進步就是縮短了首次請求的延遲。我們可以使用ASP.NET的編譯工具(aspnet_compiler.exe)就地預編譯web程序,這將編譯所有的ASP.NET文件類,而其他文件,如html文件、圖形和非ASP.NET靜態文件將保持原狀。該編譯工具調用ASP.NET運行庫編譯網站,其邏輯形式與用戶首次請求頁時相同。在編譯過程中,編譯器將為所有可執行輸出創建程序集,并將程序集存在%SystemRoot%"Microsoft.NET"Framework"version"Temporary ASP.NET Files文件夾下的特殊文件夾中,隨后ASP.NET將用此文件夾中的程序集來完成頁面的請求。如果對應用程序中的文件進行了更改,可以使用 ASP.NET 編譯工具重新編譯受影響的文件,也可以不管它,在下次向應用程序請求頁時重新編譯受影響的文件。
編譯方法:
1、瀏覽到web站點的根目錄,添加特定的程序處理precompile.axd,然后隨便瀏覽一個頁面,將頁面名稱改為 precompile.axd 這樣我們得到一個消息說“編譯已經完成”。注:這種方法我至今沒有實現,看到網上一片文章說“precompile.axd和webadmin.axd在ASP.NET2.0的beta2中已經不存在”。
2、可以選用下面的命令實現
定到%SystemRoot%"Microsoft.NET"Framework"version"
運行
aspnet_compiler -v /virtualpath
注:virtualPath參數指示網站的 Internet 信息服務 (IIS) 虛擬路徑
aspnet_compiler –p physicalorrelativepath –v /
注:在這種情況下,physicalOrRelativePath參數是指網站文件所在的完全限定目錄路徑,或者相對于當前目錄的路徑。-V指定要編譯的應用程序的虛擬目錄,如果也使用了-p參數,就使用物理路徑查找應用程序的目錄
用上面的方法編譯后就可以在上面提到的目錄里找到編譯后的程序集。
優點:
1、縮短了網站首次請求時的響應時間
2、無需特出步驟,將代碼復制到web服務器上,運行命令就行。修改文件后,可以重新編譯也可以不管。
缺點
1、要將源代碼部署在web服務器上。
2、對網站上的目錄擁有訪問權限的任何人都可以獲得源代碼和UI代碼。
第三種:可更新UI完全預編譯
通過ASP.NET編譯工具(aspnet_compiler.exe)的-u開關,可以將源代碼(.cs 和/或 .vb 文件以及 .resource 文件)編譯為 DLL 并保留 .aspx 文件中的 UI 標記以供更新。所有的DLL都被保存在bin文件夾里,這樣我們可以對網頁進行有限的更新,例如:可以更改控件的顏色、字體和其他外觀元素,而不用重新編譯應用程序。但是如果我們改變了后臺代碼則需要重新編譯。
編譯方法:
1、用visual studio2005 打開web應用程序,在工具欄里找到“生成”->“發布網站”,在“發布網站”界面上選擇“允許更新此預編譯站點”,確定后可以在目標位置,找到編譯后的web應用程序。我們看到所有的cs文件都不見了,在bin文件夾里出現了很多DLL文件。隨便打開一個頁面文件,里面的UI代碼并沒有變化,我們可以隨意修改里面的代碼而不用重新編譯程序。
2、運行命令
aspnet_compiler -p physicalOrRelativePath -v / targetPath-u
注:-u開關(此開關表示您想編譯站點以進行部署和更新)
優點:
1、縮短了網站首次請求時的響應時間。
2、用戶界面開發人員無需重新編譯整個網站即可修改網站的外觀和行為。
3、保護應用程序源代碼中包含的知識產權,以防止被對網站目錄擁有文件系統訪問權限的任何人意外看到。
缺點:
1、在部署到成品服務器之前,需要執行單獨的編譯步驟。
2、對網站目錄擁有訪問權限的任何人都可以獲取應用程序 UI 代碼(.aspx 文件)中包含的知識產權。
3、多個頁不能引用同一CodeFile類。
第四種:不可更新UI的預編譯
當使用不可更新UI的預編譯時,ASP.NET編譯工具將正常情況下運行時編譯的所有ASP.NET源文件編譯為程序集,其中包括頁中的程序代碼、.cs和.vb類文件以及其它代碼文件和資源文件,但是每個頁面并不單獨編譯為一個程序集。編譯器將從輸出中移除所有的源代碼和標記。在生成的布局中,為每個.aspx文件生成編譯后的文件(擴展名為.compiled),該文件包含指向該頁面程序集的指針。如果需要更改網站(包括頁面布局),那么必須更改原始文件,并重新編譯站點。唯一例外的是站點配置文件web.config。我們可以更改服務器上的web.config文件而不需要重新編譯。
編譯方法:
aspnet_compiler -p physicalOrRelativePath -v / targetPath
注:這里沒有開關-u
優點:
1、縮短了網站首次請求的響應時間
2、保護應用程序源代碼和 UI 代碼中包含的知識產權,以防止被對網站目錄擁有訪問權限的任何人意外看到。
缺點:
1、在部署到成品服務器以前需要單獨的編譯步驟。
2、對網站的代碼(包括UI代碼)進行很小的改動就要重新編譯整個網站。
第五種:編譯為固定名稱的程序集
在以上四種編譯方法的編譯工程中,編譯器生成的程序集使用隨機名,每次重新編譯程序程序集的名稱都會變。由于程序集的名會便,所以維護一個程序集就必須重新部署整個程序。使用ASP.NET編譯工具的-fixednames開關,或者在visual studio 2005中的發布發布網站時選擇“使用固定命名和單頁程序集”,就會為程序中的每個頁分別創建一個程序集,而其名稱該頁面的虛擬路徑,如果虛擬路徑長度超過windows文件命名允許的長度則使用路徑的哈希值。頂層目錄(app_code)中的文件編譯為單個程序集。程序集的名稱在后續編譯時不會更改,因此可以創建只替換已更改的程序集的應用程序 Service Release
編譯方法:
1、在Visual Studio 2005中發布網站的時候選擇“使用固定命名和單頁程序集”。
2、aspnet_compiler -v virtualpath targetpath –fixednames
或aspnet_compiler –p physicalorrelativepath –v / targetpath –fixednames
優點:
1、縮短網站請求時的響應時間。
2、每個程序集的名稱不會隨著多次編譯而更改,因而無需重新部署整個應用程序即可以替換特定的程序集。
3、對應用程序的次要更新可能更具有針對性。
缺點:
1、在部署到成品服務器以前需要單獨的編譯步驟。
2、需要分別為應用程序中的每個頁創建一個程序集。這可能會為包含許多頁的站點創建大量程序集。
第六種:預編譯為簽名的程序集
可以使用 ASP.NET 編譯工具創建可部署到服務器的全局程序集緩存 (GAC) 或應用程序的 Bin 目錄中的具有強名稱的程序集。使用簽名的程序集使得惡意用戶更難用惡意代碼替換應用程序的程序集。
每當使用-keyfile或-keycontainer開關為程序集簽名時,還必須使用-aptca開關指定將allowpartiallytrustedcallersattribute屬性應用于程序集。如果不指定-aptca開關,程序集就不能由 ASP.NET 進程調用,并且 Aspnet_compiler.exe 將引發異常。
編譯方法:
1、用visual studio2005發布網站的時候選擇“對預編譯程序集啟用強命名”,并填好秘鑰文件。
2、aspnet_compiler -v virtualpath targetpath –keyfile –keyfile.snk -aptca
如果使用秘鑰容器則使用下列命令
aspnet_compiler -v virtualpath targetpath –keycontainer –keycontainer.snk -aptca
如果您的網站不是 IIS 應用程序,并因此在 IIS 元數據庫中沒有項,則在命令提示符處鍵入以下內容。
3、aspnet_compiler -p physicalorrelativepath –v / targetpath –keyfile –keyfile.snk -aptca
如果使用秘鑰容器則使用下列命令
4、aspnet_compiler -p physicalorrelativepath –v / targetpath –keycontainer –keycontainer.snk -aptca
優點:
1、 共享開發環境中的密鑰管理可能很復雜。
2、程序集必須讓 ASP.NET 運行庫allowpartiallytrustedcallersattribute屬性
另,批處理文件
@echo off
echo -----------------------------------------------------
echo 我的公司
echo.
echo v 3.24
echo.
echo -----------------------------------------------------
c:
cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\
echo 定位編譯程序所在目錄……
rem C:\程序發布\001 這個部分的001文件夾改為要發布的目標地址,在重新發布前需要刪除這個目錄
if exist C:\程序發布\001 echo.&echo 刪除老版本……&echo.&rmdir /s /q C:\程序發布\001&echo 刪除老版本完畢!
echo.
echo 程序開始發布……
echo 開始時間:%date:~0,10% %time:~0,8%
echo.
echo 請稍候……
rem 執行編譯命令,其中-v 為虛擬目錄(可以為空) -fixednames(固定程序集) -nologo(不顯示版權信息) -p 物理路徑,第一個為被發布程序 第二個為目標目錄
aspnet_compiler -v / -fixednames -nologo -d -p C:\程序發布\Web C:\程序發布\001
echo.
echo 程序發布完畢!
echo 結束時間:%date:~0,10% %time:~0,8%
pause
::-c 只編譯變動的部分 -u 是否可更新,如果指定,則可以更新