使用aspnet_compiler對web程序進行預編譯

1、本例使用的是asp.net中的webform項目。

使用.net框架爲.net3.5html

2、操做步驟

(1)正常的web項目發佈步驟web

發佈方法:文件系統數據庫

目標位置:發佈後的項目文件的路徑,可自定義。windows

(2)打開windows資源管理器,能夠看到發佈後的相關文件。服務器

(3)打開VS2008的命令提示符工具app

 

 (4)在命令提示符中輸入 命令,並回車。框架

命令示例: aspnet_compiler.exe -v \ -p E:\WebIIS\EIS E:\WebIIS\EIS_Precompiled -fixednames

參數說明:asp.net

aspnet_compiler.exe  aspnet_compiler命令ide

-v \  要編譯的虛擬路徑,這裏表示根路徑。工具

-p E:\WebIIS\EIS 要編譯的源Web項目所在文件夾。

E:\WebIIS\EIS_Precompiled 編譯目標文件夾。

-fixednames 每一個.aspx與.ascx文件都編譯生成單獨的dll文件,並使用固定文件名。

注:執行前,須要將預編譯文件夾中的內容清空,不然命令提示符窗口沒法執行預編譯操做。

 

(5)回車執行。會執行一段時間。。。。。。

 

 

 

(6)防止某些頁面被遺漏

發佈的文件夾->     E:\WebIIS\EIS

預編譯的文件夾->  E:\WebIIS\EIS_Precompiled

全選E:\WebIIS\EIS文件夾中的全部文件,複製到E:\WebIIS\EIS_Precompiled。粘貼全部文件,按照提示覆制和替換已存在的文件。

(7)此時

 預編譯的文件夾->  E:\WebIIS\EIS_Precompiled ,此文件夾中的文件即爲發佈到服務器上的文件。

將該文件夾壓縮爲EIS_Precompiled.zip,發送至服務器。再將壓縮包解壓,全部文件放置到IIS對應的文件夾中便可。

(8)至此,asp.net程序的發佈預編譯結束。

 3、預編譯工具的選擇。

一、前言

本例中的項目是使用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文件後,其內容爲

 1 @echo off
 2 if "%1" == "" goto x86
 3 if not "%2" == "" goto usage
 4 
 5 if /i %1 == x86       goto x86
 6 if /i %1 == amd64     goto amd64
 7 if /i %1 == x64       goto amd64
 8 if /i %1 == ia64      goto ia64
 9 if /i %1 == x86_amd64 goto x86_amd64
10 if /i %1 == x86_ia64  goto x86_ia64
11 goto usage
12 
13 :x86
14 if not exist "%~dp0bin\vcvars32.bat" goto missing
15 call "%~dp0bin\vcvars32.bat"
16 goto :eof
17 
18 :amd64
19 if not exist "%~dp0bin\amd64\vcvarsamd64.bat" goto missing
20 call "%~dp0bin\amd64\vcvarsamd64.bat"
21 goto :eof
22 
23 :ia64
24 if not exist "%~dp0bin\ia64\vcvarsia64.bat" goto missing
25 call "%~dp0bin\ia64\vcvarsia64.bat"
26 goto :eof
27 
28 :x86_amd64
29 if not exist "%~dp0bin\x86_amd64\vcvarsx86_amd64.bat" goto missing
30 call "%~dp0bin\x86_amd64\vcvarsx86_amd64.bat"
31 goto :eof
32 
33 :x86_ia64
34 if not exist "%~dp0bin\x86_ia64\vcvarsx86_ia64.bat" goto missing
35 call "%~dp0bin\x86_ia64\vcvarsx86_ia64.bat"
36 goto :eof
37 
38 :usage
39 echo Error in script usage. The correct usage is:
40 echo     %0 [option]
41 echo where [option] is: x86 ^| ia64 ^| amd64 ^| x86_amd64 ^| x86_ia64
42 echo:
43 echo For example:
44 echo     %0 x86_ia64
45 goto :eof
46 
47 :missing
48 echo The specified configuration type is missing.  The tools for the
49 echo configuration might not be installed.
50 goto :eof
View Code

再根據 %~dp0bin\vcvars32.bat,找到C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat 

其內容爲

1 "%VS90COMNTOOLS%vsvars32.bat"
View Code

 

裏面是bat腳本,研究終止。

因此,我仍沒法解釋緣由。

還望知曉者能告知,以解我迷惑之處。

相關文章
相關標籤/搜索