使用.net框架为.net3.5html
(1)正常的web项目发布步骤web
发布方法:文件系统数据库
目标位置:发布后的项目文件的路径,可自定义。windows
(2)打开windows资源管理器,能够看到发布后的相关文件。服务器
(3)打开VS2008的命令提示符工具app
(4)在命令提示符中输入 命令,并回车。框架
参数说明: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程序的发布预编译结束。
一、前言
本例中的项目是使用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
再根据 %~dp0bin\vcvars32.bat,找到C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat
其内容为
1 "%VS90COMNTOOLS%vsvars32.bat"
里面是bat脚本,研究终止。
因此,我仍没法解释缘由。
还望知晓者能告知,以解我迷惑之处。