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