前言
本例使用的是asp.net中的webform項目,使用.net框架為.net3.5
操作步驟
正常的web項目發布步驟
發布方法:文件系統
目標位置:發布后的項目文件的路徑,可自定義。
打開windows資源管理器,可以看到發布后的相關文件
打開VS2008的命令提示符工具
在命令提示符中輸入 命令,並回車
參數說明:
aspnet_compiler.exe aspnet_compiler命令
-v \ 要編譯的虛擬路徑,這里表示根路徑。
-p E:\WebIIS\EIS 要編譯的源Web項目所在文件夾。
E:\WebIIS\EIS_Precompiled 編譯目標文件夾。
-fixednames 每個.aspx與.ascx文件都編譯生成單獨的dll文件,並使用固定文件名。
注:執行前,需要將預編譯文件夾中的內容清空,否則命令提示符窗口無法執行預編譯操作。
回車執行。會執行一段時間。。。。。。
防止某些頁面被遺漏
發布的文件夾-> E:\WebIIS\EIS
預編譯的文件夾-> E:\WebIIS\EIS_Precompiled
全選E:\WebIIS\EIS文件夾中的所有文件,復制到E:\WebIIS\EIS_Precompiled。粘貼所有文件,按照提示復制和替換已存在的文件。
此時
預編譯的文件夾-> E:\WebIIS\EIS_Precompiled ,此文件夾中的文件即為發布到服務器上的文件。
將該文件夾壓縮為EIS_Precompiled.zip,發送至服務器。再將壓縮包解壓,所有文件放置到IIS對應的文件夾中即可。
至此,asp.net程序的發布預編譯結束。
預編譯工具的選擇
前言
本例中的項目是使用VS2010編寫的,剛開始進行預編譯操作是使用VS2010命令提示符進行的。
但是將預編譯后的文件發布到服務器上后,竟然無法訪問。
於是按照同事的操作步驟,安裝了VS2008,使用VS2008命令提示符進行預編譯操作。
但是又想着,只是為了預編譯而安裝了個VS2008,是不是太浪費資源了。
經百度得到簡易方法。
原博文
http://blog.csdn.net/fer_ba/article/details/5766568
示例
(1)使用CMD命令提示符,進行操作。這種方法其實是VS2008命令提示符的手動執行操作。
第一步:切換到aspnet_compiler.exe所在目錄
在“命令提示符”下,切換到所在目錄“c:/windows/microsoft/framework/v2.0.50727”。
第二步:運行aspnet_compiler.exe預編譯
Aspnet_Compiler -v test c:/tmp/test
-v是虛擬目錄參數,test為虛擬目錄名稱,而c:/tmp/test是指先行編譯后的程序文件的目的位置。
第三步:使用預編譯后的網站
將預編譯后的test目錄Copy到正式網頁服務器,部署網站。
但要注意:aspnet_compiler.exe不會對靜態文件如:Web.config、文本文件和圖片文件等進行編譯,所以像數據庫連接字符串請用aspnet_regiis.exe工具來進行加密。
網站預編譯后,以后也不會觸發重新動態編譯,故請不要事后再加入新的.aspx文件,那樣不會有任何作用。
按照本例的目錄,進行實際的使用。經過預編譯后的文件可以正常的訪問。
(2)通過ClientBuildManager類進行編譯
string vdir = "/MyDataSource"; //虛擬目錄名稱
string srcLocation = "c://Inetpub//wwwroot//VS2005IDE"; //來源位置
string tarLocation = "c://tmp//VS2005IDE"; //目標位置
System.Web.Compilation.ClientBuildManager cbm = new System.Web.Compilation.ClientBuildManager(vdir,srcLocation,tarLocation);
cbm.PrecompileApplication(); //預編譯
按照本例的目錄,進行實際的使用。經過預編譯后的文件可以正常的訪問。
其中有三個參數,
// 摘要:
// 使用指定的目標目錄初始化 System.Web.Compilation.ClientBuildManager 類的新實例。
// 參數:
// appVirtualDir:
// 應用程序根目錄的虛擬路徑。
// appPhysicalSourceDir:
// 應用程序根目錄的物理路徑。
// appPhysicalTargetDir:
// 用於預編譯的目標目錄。
public ClientBuildManager(string appVirtualDir, string appPhysicalSourceDir, string appPhysicalTargetDir);
我將虛擬路徑設置為空,應用程序根目錄的物理路徑設置為E:\\WebIIS\\EIS(程序發布的路徑),預編譯的目標目錄,設置為E:\\WebIIS\\EIS_Precompiled(預編譯后的目錄)
總結
(1)前言
經過測試發現,使用VS2010和VS2008的命令提示符進行操作時,只有VS2008命令提示符的預編譯結果可以執行。
在使用System.Web.Compilation.ClientBuildManager類進行預編譯時,
發現其使用的dll文件目錄就是在C:\Windows\Microsoft.NET\Framework\v2.0.50727目錄中。
而我部署的IIS應用程序池的版本也是.net2.0
(2)猜測
而我使用VS2010時可能使用的是C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe目錄下的程序,然后和IIS的版本不一致導致的無法訪問。
(3)為了驗證這個猜測,
我使用.net4.0目錄下的aspnet_compiler進行預編譯,IIS環境仍然是.net2.0。運行結果如下,運行出錯。
然后將IIS的.net版本修改為.net4.0進行測試,結果如下,仍然報錯。
(4)百度尋找答案,搜索到相關問題。
原博文
https://www.2cto.com/kf/201109/103431.html
其中有着一段話:利用aspnet_compiler預編譯,該程序工具兩個版本, Framework2.0和4.0,位於WINDOWS\Microsoft.NET\Framework\版本號的文件夾內,前者適用於2.0\3.0\3.5的asp.net網站,后者是針對4.0及更高版本的asp.net。
而我使用的web程序使用的.net框架是.net3.5,
也就是得使用C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe文件,
而非C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe文件。
如此一來,上面使用.net4.0版本的預編譯工具編譯后,無法訪問也就可以理解了。
(5)剩下的猜測
VS2008命令提示符工具調用的是.net2.0版本的aspnet_compiler預編譯工具,
VS2010命令提示符工具調用的是.net4.0版本的aspnet_compiler預編譯工具。
具體的驗證,我也嘗試去研究但是因為不懂bat腳本的語法,而無法進行下去。
(6)關於(5)猜測的驗證
VS2008命令提示符的屬性,其中目標的值:%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"" x86
找到該vcvarsall.bat文件后,其內容為
@echo off if "%1" == "" goto x86 if not "%2" == "" goto usage if /i %1 == x86 goto x86 if /i %1 == amd64 goto amd64 if /i %1 == x64 goto amd64 if /i %1 == ia64 goto ia64 if /i %1 == x86_amd64 goto x86_amd64 if /i %1 == x86_ia64 goto x86_ia64 goto usage :x86 if not exist "%~dp0bin\vcvars32.bat" goto missing call "%~dp0bin\vcvars32.bat" goto :eof :amd64 if not exist "%~dp0bin\amd64\vcvarsamd64.bat" goto missing call "%~dp0bin\amd64\vcvarsamd64.bat" goto :eof :ia64 if not exist "%~dp0bin\ia64\vcvarsia64.bat" goto missing call "%~dp0bin\ia64\vcvarsia64.bat" goto :eof :x86_amd64 if not exist "%~dp0bin\x86_amd64\vcvarsx86_amd64.bat" goto missing call "%~dp0bin\x86_amd64\vcvarsx86_amd64.bat" goto :eof :x86_ia64 if not exist "%~dp0bin\x86_ia64\vcvarsx86_ia64.bat" goto missing call "%~dp0bin\x86_ia64\vcvarsx86_ia64.bat" goto :eof :usage echo Error in script usage. The correct usage is: echo %0 [option] echo where [option] is: x86 ^| ia64 ^| amd64 ^| x86_amd64 ^| x86_ia64 echo: echo For example: echo %0 x86_ia64 goto :eof :missing echo The specified configuration type is missing. The tools for the echo configuration might not be installed. goto :eof
再根據 %~dp0bin\vcvars32.bat,找到C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat
其內容為
"%VS90COMNTOOLS%vsvars32.bat"
里面是bat腳本,研究終止。
所以,我仍無法解釋原因。
還望知曉者能告知,以解我迷惑之處。