VS.NET的“复制项目”功能使我们能够非常轻松地把ASP.NET Web应用部署到目标服务器。这个功能既可以把Web项目复制到同一服务器,也可以复制到不同的服务器。
如果你用VS.NET开发Web应用程序,发布Web应用之前要做的第一件事情是把“活动的解决方案配置”从Debug改成Release,如图三所示,这个选项不仅使编译器优化代码,而且删除所有与调试有关的符号信息,使代码运行速度更快。打开配置管理器的步骤是:在“解决方案资源管理器”中选择Web应用项目,选择菜单“项目”→“XXXX项目属性”,其中XXXX是项目名称,再点击“配置管理器”。在“活动的解决方案配置”中选择“Release”。
图三
要把Web项目复制到目标服务器,在VS.NET中选择菜单“项目”→“复制项目...”,VS.NET显示出图四的对话框。
图四
“复制项目”对话框提供了下列选项:
㈠ 目标项目文件夹:用来指定复制项目的目标位置。目标位置可以在同一个服务器上,也可以在一个远程服务器上。
㈡ Web访问方法:将Web项目复制到目标文件夹时所用的方法,可供选择的Web访问方法有两种。首先是“文件共享”,即通过文件共享机制直接访问Web服务器上的文件系统,不要求Web服务器上安装有FrontPage服务器扩展;其次是“FrontPage”,即通过基于HTTP协议的FrontPage服务器扩展把Web项目的文件传输到服务器,使用该选项要求Web服务器上必须安装了FrontPage服务器扩展,这种Web访问方法能够在目标服务器上自动创建必要的虚拟目录。
㈢ 复制:包含三个选项,分别是:① 仅限于运行该应用程序所需的文件,即只复制“生成”功能输出的文件(bin文件夹中的 DLL 和引用)以及内容文件(例如.aspx和.asmx文件),大多数情况下,我们可以用该默认选项部署应用程序;② 所有项目文件,即复制“生成”功能输出的文件(bin文件夹中的DLL和引用)和项目中的所有文件,包括项目文件和源程序文件,③ 源项目文件夹中的所有文件,即项目文件夹(或子文件夹)中的所有项目文件和任何其他文件。
根据实际情况选择图四对话框的选项,点击“确定”,即可把Web项目部署到服务器。
六、用Web安装项目部署
XCOPY部署和VS.NET的“复制功能”简单易用,但不能够满足所有的部署需要。例如,如果应用程序有更加复杂的配置和部署要求,VS.NET的“Web安装项目”才是最佳的选择。
虽然我们可以用一大堆的生成输出、安装类、数据库创建脚本来发布Web应用,但对于复杂的Web应用项目,通常不如使用Windows安装程序来得方便。为支持Web应用部署,VS.NET专门提供了一种“Web安装项目”。Web安装项目与普通的安装项目不同,Web安装项目把Web应用安装到Web服务器的虚拟根文件夹上,而普通安装项目一般把应用程序安装到Program Files目录。
由于VS.NET安装程序建立在Windows安装程序的基础上,所以能够利用Windows安装程序的优势。在开始探讨VS.NET Web安装项目之前,我们先来了解一下Windows安装程序的主要特点,因为它是VS.NET Web安装项目的核心基础。
6.1 Windows安装程序
Windows安装程序是一个软件安装和配置服务,Windows 2000和Windows XP操作系统都带有Windows安装程序,而且微软为所有Win 9x和NT 4平台也提供了功能相似的免费版本。在Win2K/XP中,Windows安装程序的核心是一个Windows Installer服务,Windows Installer服务记录了它安装的每一个应用程序,当我们删除一个应用软件时,Windows Installer检查安装记录,在删除应用的组件之前确保其他应用不依赖于这些组件。
Windows Installer将应用划分成以下三个等级:
⑴ 产品:用户可以安装的一个单元。例如,MS Word就是一个用户可以安装的产品。
⑵ 功能:产品由多种功能组成,功能是产品用途的最小单位。例如,自动更正就是Word的一项功能。
⑶ 组件:组件可以看作能够在多个功能和组件之间共享的最小单元。必须注意的是,Windows Installer术语中的组件不同于.NET框架中组件的概念。一个Windows Installer的组件是一个或者多个逻辑上密切相关的文件,它可以是一个执行文件,一个DLL文件,也可以是一个简单的文本文件。一项功能可以由多个组件结合在一起提供,同时,一个组件也可以由多项功能共享。功能总是针对特定的产品而言,且功能的名称只在特定的产品范围内唯一;相比之下,组件是全局性的,其作用范围是一台机器上安装的所有产品。例如,Word的拼写检查组件可以在所有想要实现拼写检查功能的组件之间共享。
与产品有关的信息,包括功能、组件的描述等,都在一个安装数据库中集中保存。安装数据库其实只是一个带.msi扩展名的文件,它不仅包含了产品的功能、组件的信息,而且还定义了安装产品期间各个用户界面的显示次序。由于Windows Installer注册成了.msi文件的服务程序,当用户打开.msi文件时,操作系统会自动调用Windows Installer。按照这种方式启动Windows Installer时,Installer从安装数据库读取产品信息,判断该产品是否已经安装。如果尚未安装,Installer按照安装数据库的描述开始安装操作;如果产品已经安装,可能执行其他处理,例如添加/删除某项功能,或者卸载整个产品。
6.2 VS.NET Web安装项目的特点
VS.NET中的部署项目以Windows Installer的功能为基础,允许我们执行如下操作:
⑴ 读取、写入注册键。
⑵ 在目标服务器的Windows文件系统中创建目录。
⑶ 提供注册组件的机制。
⑷ 提供安装期间从用户收集信息的机制。
⑸ 允许设置启动条件,例如检查用户名字、计算机名字、当前的操作系统、已经安装的软件、是否已经安装了.NET CLR,等等。
⑹ 允许在安装结束后运行自定义的配置程序或脚本。
在下面一节中,我们将了解如何用VS.NET Web安装项目来部署DeploymentExampleWebApp。
七、创建Web安装项目
首先我们在DeploymentExampleApp ASP.NET Web应用程序解决方案中创建一个Web安装程序项目:选择菜单“文件”→“新建”→“项目”,在“新建项目”对话框中,指定项目类型“安装和部署项目”,指定模板“Web安装项目”,如图五所示。
图五
创建项目之后,接下来要把ASP.NET Web应用程序的程序集和内容文件加入到安装项目。在解决方案资源管理器中右击DeploymentExampleWebAppSetup项目,选择菜单“添加”→“项目输出”,在“添加项目输出组”对话框中,“项目”一栏选择DeploymentExampleWebApp,再从列表选择“主输出”,如图六。
图六
加入了项目输出之后,接下来要把相关的内容文件(包括.aspx文件、图形文件等)加入到项目。再次打开“添加项目输出组”对话框,这一次从列表选择“内容文件”,如图七。
图七
在Web安装项目中加入了“主输出”和“内容文件”之后,解决方案资源管理器应该类如图八所示。
图八
通过Web安装项目的属性窗口可以设置许多属性,这些属性决定了Windows安装文件运行时显示的内容和行为方式。在解决方案管理器中右击DeploymentExampleWebAppSetup,选择菜单“属性”,就可以打开图九的属性设置窗口。
图九
从图九可以看出,属性窗口允许设置作者、产品描述、厂商、支持电话等信息,这些信息对于应用的最终用户来说可能非常有用。
八、安装ASP.NET Web应用程序
创建好Windows安装文件(.msi文件)之后,再到目标服务器上安装ASP.NET应用就很方便了,只要在Windows资源管理器中双击.msi文件即可,这时安装向导启动,引导用户完成安装过程。图十显示了安装期间显示的第一个对话框。
图十
点击图十对话框的“下一步”按钮,出现图十一的对话框,在这里可以指定Web应用要安装到哪一个虚拟目录。这是VS.NET的Web安装项目最方便的特性之一,虚拟目录创建已完全自动化,根本不需要用户手工操作。在本文的第二部分中,我们将看到如何在安装过程中设置虚拟目录的特殊属性,例如目录安全性等。
图十一
在图十一的对话框中,我们可以点击“磁盘开销”按钮了解安装该Web应用程序所需的磁盘空间。点击“下一步”,出现图十二的对话框,向导要求我们确认安装。
图十二
如果在图十二的对话框中点击“下一步”,安装操作正式开始,应用程序被安装到Web服务器上。如果应用程序安装成功,出现图十三的对话框。
图十三
安装好应用程序后,从控制面板的“添加或删除程序”窗口可以看到刚才安装的ASP.NET应用程序,以后,我们可以随时从这里卸载刚才安装的ASP.NET Web应用。
九、结束语
XCOPY和“复制项目”都是不错的部署技术,主要的特点是简单,但需要一些手工操作。它们非常适合安装过程比较简单的应用,但在有些情况下,我们需要在安装过程中执行更加复杂的操作,这时最好利用Windows Installer技术来部署应用。用Windows Installer来部署ASP.NET Web应用具有下列优点:
⑴ 如果用Windows Installer安装的应用被损坏,可以通过Windows安装包的修复功能自我修复。如果采用其他部署方式,损坏的组件必须手工替换。
⑵ 使用Windows Installer技术时,我们还可以利用自动回退功能的优势。当安装过程失败时,自动回退功能不仅确保已安装的组件被正确删除,而且保证了机器能够恢复到安装程序启动之前的状态。
⑶ 由于Windows Installer用一个.msi安装数据库保存所有的安装信息,所以有可能获取复制了哪些文件、创建了哪些注册键之类的信息。
⑷ 如果ASP.NET应用要分发给多个用户使用(或者将软件打包销售),一种方便、自动化的部署机制是必不可少的,象XCOPY部署这样的手工操作显然是不合适的。如果使用Windows Installer这种成熟、强大的安装技术,整个安装过程都可以自动化,极大地简化应用部署。
这一部分文章示范了封装和部署ASP.NET Web应用的各种方式,介绍了如何利用Windows Installer技术的优势,以及创建.msi的具体过程。在本文的下一部分中,我们将在前面Windows Installer示例的基础上,增添各种高级功能,诸如定制安装对话框及其出现次序,以及安装过程中如何加入注册键、创建定制文件夹,等等。
下载本文的代码:DeployingAspnet_code1.zip。