使用aspnet_compiler对web程序进行预编译

一、本例使用的是asp.net中的webform项目。

使用.net框架为.net3.5

二、操作步骤

(1)正常的web项目发布步骤

发布方法:文件系统

目标位置:发布后的项目文件的路径,可自定义。

(2)打开windows资源管理器,可以看到发布后的相关文件。

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

 

 (4)在命令提示符中输入 命令,并回车。

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

参数说明:

aspnet_compiler.exe  aspnet_compiler命令

-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程序的发布预编译结束。

 三、预编译工具的选择。

1、前言

本例中的项目是使用VS2010编写的,刚开始进行预编译操作是使用VS2010命令提示符进行的。

但是将预编译后的文件发布到服务器上后,竟然无法访问。

于是按照同事的操作步骤,安装了VS2008,使用VS2008命令提示符进行预编译操作。

但是又想着,只是为了预编译而安装了个VS2008,是不是太浪费资源了。

经百度得到简易方法。原作者传送门:http://blog.csdn.net/fer_ba/article/details/5766568

2、示例:

(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(预编译后的目录)

 

3、总结

(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脚本,研究终止。

所以,我仍无法解释原因。

还望知晓者能告知,以解我迷惑之处。

 

转载于:https://www.cnblogs.com/masonblog/p/7838462.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值