提纲:
一、概述
二、asp.net web应用的结构
三、asp.net支持的部署机制
四、用xcopy命令部署
五、用vs.net的“复制项目”功能部署
六、用web安装项目部署
6.1 windows安装程序
6.2 vs.net web安装项目的特点
七、创建web安装项目
八、安装asp.net web应用程序
九、结束语
正文:
一、概述
在深入到配置和部署asp.net web应用程序的具体步骤之前,理解配置(setup)和部署(deployment)之间的区别是十分必要的。配置是指将应用包装成易于部署的形式,包装好之后的应用程序可以方便地安装到目标服务器上。部署是一个获得应用程序并将它安装到另一台机器上过程,一般通过安装程序完成。
许多用户都曾经遇到过windows软件安装技术的脆弱点——当我们安装某个软件的新版本时,安装程序将新版的dll文件复制到系统目录,同时执行所有必要的注册表修改操作,但是,安装操作可能影响其他运行在同一机器上的软件,尤其是原有的软件和新安装的软件共享某一组件时,出现问题的可能性更大。如果新安装的组件与它的早期版本向后兼容,当然没有问题,但许多情况下,完全保持向后兼容难以做到,所以经常会遇到安装了一个新软件之后损坏原有软件的情形,这就是臭名昭著的dll hell问题。
visual studio.net(vs.net)的设计目标之一就是解决安装windows软件时经常遇到的问题。vs.net应用的许多功能都依赖.net框架类库实现,.net框架类库建立了一个全新的编程模型,从而为极大地简化安装过程创造了条件。另外,vs.net应用程序编译成程序集(assembly),程序集是由一个或多个支持程序集运行的文件构成的部署单元。微软.net框架引入了许多简化应用程序部署、解决dll hell问题的新特性,例如,配置信息可以保存在web.config配置文件,web.config配置文件是一个xml格式的文本文件,可以利用xcopy之类的命令直接复制和部署到目标服务器。
在探讨各种部署机制之前,我们首先来了解一下asp.net应用的结构,因为正是这个结构才使得应用能够方便地部署到目标服务器上。
二、asp.net web应用的结构
asp.net应用程序由各种web页面(.aspx和html文件)、处理程序、模块、执行代码和其他文件(例如图形文件,配置文件等)构成,这些文件都可以从web服务器的虚拟目录引用。如果使用了.aspx文件的codebehind机制,asp.net应用程序还包含编译好的程序集,另外还有其他支持应用程序的程序集,例如,可以把应用的业务逻辑封装成一个单独的程序集。程序集一般位于应用程序虚拟目录的bin子目录下。要理解vs.net如何简化部署过程,必须理解程序集的结构,因为正是程序集的结构特点才使得简化部署成为可能。程序集包含四种元素:
⑴ msil代码,即微软中间语言代码:编译应用程序代码时,源代码被编译成所谓的msil代码。msil代码是.net公共语言运行时环境(clr)所理解的代码。
⑵ 元数据:描述代码中定义的类型、方法和其他元素。
⑶ manifest:包含名称和版本信息,程序集中包含文件的清单,安全信息,等等。
⑷ 支持文件和资源。
从这个结构可以看出,程序集包含了完整的自我描述信息,所以vs.net应用程序根本不必象com组件那样在注册表中注册。这就是说,只要目标机器上也安装了.net框架,安装vs.net应用程序时只要简单地将必需的文件复制到目标机器就可以了,这就是所谓的xcopy部署。不过,除了xcopy之外,还可以使用vs.net提供的“web安装项目”实现自动部署。在接下来的内容中,我们将看到如何利用各种不同的部署机制部署一个web应用。
三、asp.net支持的部署机制
asp.net web应用程序支持下列三种部署方案:
⑴ xcopy部署
⑵ 利用vs.net的“复制项目”功能部署
⑶ 使用vs.net的“web安装项目”部署
在接下来的内容中,我们将深入了解所有这三种部署机制。为便于说明,我们先要创建一个visual c# asp.net web应用程序,应用的名称为deploymentexamplewebapp,如图一所示。
图一
我们将以这个项目为例,阐述部署web应用的各种方法。
四、用xcopy命令部署
.net框架的主要目标之一就是简化部署,例如支持xcopy部署。在了解.net如何支持xcopy部署之前,我们先来看看xcopy部署到底是怎么回事。在.net之前,安装一个组件(例如一个com组件)意味着不仅要把组件复制到适当的目录,而且还要执行注册表修改之类的操作。但现在有了.net,安装一个组件的全部操作就是将程序集复制到客户应用程序的bin目录,由于程序集包含完整的自我描述信息,应用程序可以立即开始使用程序集。这一切之所以成为可能,是因为编译器将标识符和元数据信息嵌入到了编译好的模块之中,而clr利用这些信息来装入程序集的适当版本。标识符包含了装入和运行模块、查找程序集引用的其他模块所需的所有信息。这种安装也称为无干扰(zero-impact)安装,因为系统不会因为修改注册表、配置组件而受到影响;另外,无干扰安装也使得组件卸载操作不会对系统产生任何意外的影响,卸载组件时只要从特定的目录删除某些文件就可以了。
执行xcopy部署时,唯一要做的就是打开一个命令窗口,用xcopy命令将必要的文件复制到服务器的特定目录。图二显示了如何用xcopy部署将名为deploymentexamplewebapp的web应用部署到目标服务器remoteserver。
图二
可以看到,xcopy命令有许多选项:
⑴ /e:表示将源位置的目录、子目录和文件都复制到目标位置,包括空目录。
⑵ /k:保留所有现有的文件和文件夹的属性。默认情况下,xcopy命令复制文件或目录结构时会忽略文件的属性,例如,如果文件原来有只读属性,复制到目标位置后只读属性丢失。要保留原来的文件属性,必须加上/k选项。
⑶ /r:覆盖带有只读属性的文件。
⑷ /o:保留文件或文件夹的所有与安全有关的acl权限设置。
⑸ /h:隐藏文件和系统文件也要复制。
⑹ /i:要求xcopy将目标位置视为一个目录,如指定的目录不存在,则创建它。
把文件夹复制到目标服务器之后,接下来在目标服务器上用iis管理器创建一个虚拟目录,把虚拟目录映射到xcopy创建的物理目录——这就是用xcopy将一个asp.net web应用部署到远程服务器所要做的全部操作。
