演练:安装时重定向应用程序以面向另一个 Web 服务
本演练演示如何使用**“URL 行为”**属性、Installer 类和 Web 安装项目创建可重定向以面向另一个 Web 服务的 Web 应用程序。 这在以下情况下很有用:开发期间需要在本地面向 Web 服务,并且在部署应用程序时希望使用 Web 服务的成品版本。
提示
对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关更多信息,请参见 Visual Studio 设置。
创建 Web 应用程序项目
第一步是创建一个包含对 Web 服务的 Web 引用的 ASP.NET Web 应用程序项目。
创建项目
- 创建具有对 Web 服务的 Web 引用的 Web 应用程序。 对任何有效 Web 服务的 Web 引用都适用于本演练。
添加 Installer 类
Installer 类(也称为“安装组件”)是安装期间作为自定义操作调用的 .NET Framework 类。 在本例中,您将向解决方案添加一个类库项目。 在该类库项目中,您将创建一个 Installer 类,并重写其 Install 方法,添加代码以修改 Web 应用程序的 .config 文件。
创建类库项目
右击**“解决方案资源管理器”中的解决方案节点,单击“添加”,然后单击“新建项目”**。
在**“添加新项目”对话框的“Visual Basic”节点中选择“类库”**。
将项目命名为 InstallerClassLibrary。
添加和实现 Installer 类
右击**“解决方案资源管理器”中的“InstallerClassLibrary”项目节点,单击“添加”,然后单击“类”**。
在**“添加新项”对话框中,选择“安装程序类”,并将“名称”**更改为 WebServiceInstaller.vb。
单击**“添加”**时,该类将被添加到项目中,并打开 Installer 类的设计器。
双击此设计器以打开代码编辑器。
在 WebServiceInstaller.vb 中,将下面的代码添加到 Installer 类模块的底部(紧挨在“End Class”声明的上面);此代码实现 Install 方法:
Public Overrides Sub Install( ByVal stateSaver As System.Collections.IDictionary) ' Gets the parameter passed across in the CustomActionData. Dim install_log As New System.IO.StreamWriter("Installation.log") install_log.AutoFlush = True Try Dim providedName = Me.Context.Parameters.Item("ServerName") Dim svcName = Me.Context.Parameters.Item("ServiceName") install_log.WriteLine("Starting Edit of the config file") If providedName = "" OrElse svcName = "" Then Throw New InstallException("No arguments specified") End If ' Uses reflection to find the location of the config file. Dim strConfigLoc = System.Reflection.Assembly.GetExecutingAssembly().Location Dim strTemp = strConfigLoc strTemp = strTemp.Remove(strTemp.LastIndexOf("\"), Len(strTemp) - strTemp.LastIndexOf("\")) strTemp = strTemp.Remove(strTemp.LastIndexOf("\"), Len(strTemp) - strTemp.LastIndexOf("\")) Dim fInfo As New System.IO.FileInfo(strTemp & "\web.config") install_log.WriteLine("File info: " & strTemp) If Not fInfo.Exists Then Throw New InstallException("Missing config file") End If ' Loads the config file into the XML DOM. ' Loads the config file into the XML DOM. Dim xmlDoc = XDocument.Load(fInfo.FullName) ' Finds the right node and change it to the new value. Dim foundIt As Boolean = False For Each node In xmlDoc.<configuration>.<appSettings>.<add> If node.@key = "servername.service" Then ' Note that "Service1.asmx" should be replaced with the ' actual name of the XML Web service file. node.@value = "http://" & providedName & "/" & svcName & "/Service1.asmx" foundIt = True End If Next node If Not foundIt Then Throw New InstallException("Config file did not contain a ServerName section") End If ' Writes out the new config file. xmlDoc.Save(fInfo.FullName) Finally install_log.WriteLine("Ending edit of config file") install_log.Close() End Try End Sub
以上代码首先创建一个记录自定义操作进度的安装日志文件。 System.Reflection 命名空间用于定位正在安装的程序集和查找关联的 .config 文件。 XML 文档模型用于循环访问 .config 文件直到找到 appSettings 节。 当找到键 servername.service 时,将更改其关联值以包含传入的参数,从而重定向应用程序以使用新的 Web 服务。
在**“解决方案资源管理器”**中,双击 Web.config 文件将其打开。
在 appSettings 节中,复制用于 Web 服务的键的值。 键采用 servername.service 形式,其中服务器名称 是 Web 服务所在的服务器,而服务 是 Web 服务的名称。
在代码编辑器中打开 Installer 类模块,将文本“servername.service”替换为您在前一步中复制的值。
添加 Web 安装项目
安装项目用于为应用程序创建安装程序。 基于 Windows Installer 技术,安装项目包含在安装期间运行自定义操作和自定义安装用户界面等多项功能。 有关安装项目的更多信息,请参见部署应用程序和组件。
添加 Web 安装项目
右击**“解决方案资源管理器”中的解决方案节点,单击“添加”,然后单击“新建项目”**。
在**“添加新项目”对话框的“项目类型”窗格中,展开“其他项目类型”节点,然后选择“安装和部署项目”**节点。
在**“模板”窗格中选择“Web 安装项目”。 在“名称”**框中将项目命名为 WebAppSetup。
单击**“确定”后,项目将添加到解决方案中,并且“文件系统编辑器”**将打开。
在**“属性”**窗口中,选择 ProductName 属性并将它设置为 Web 应用程序的名称。
在**“文件系统编辑器”中,选择“Web 应用程序文件夹”**。
在**“操作”菜单上指向“添加”,然后单击“项目输出”**。
在**“添加项目输出组”对话框中,从“项目”下拉列表中选择“InstallerClassLibrary”,然后选择“主输出”**。
单击**“确定”**后,InstallerClassLibrary 的主输出将添加到 Web 安装项目中。
添加自定义操作
自定义操作用于在安装结束时运行代码,以执行安装期间无法处理的操作。 自定义操作的代码可以包含在 .dll、.exe、脚本或程序集文件中。 有关自定义操作的更多信息,请参见部署中的自定义操作管理。
将 Installer 类添加为自定义操作
在**“解决方案资源管理器”中选择“WebAppSetup”**项目。
在**“视图”菜单上单击“编辑器”,然后单击“自定义操作”**。
打开**“自定义操作编辑器”**。
在**“自定义操作编辑器”中选择“安装”**节点。
在**“操作”菜单上选择“添加自定义操作”**。
双击**“Web 应用程序文件夹”,然后选择“主输出来自 InstallerClassLibrary (活动)”**。
在**“属性”窗口中,确保“InstallerClass”属性设置为“True”**。
选择 CustomActionData 属性并键入以下文本:/ServerName=[EDITA1] /ServiceName=[EDITA2]
CustomActionData 属性提供两个传递给自定义操作的参数,它们由一个空格分隔。
添加对话框
安装期间会显示用户界面对话框,以收集来自用户的信息。 有关用户界面对话框的更多信息,请参见部署中的用户界面管理。
添加自定义用户界面对话框
在**“解决方案资源管理器”**中选择安装项目。
在**“视图”菜单上指向“编辑器”,然后单击“用户界面”**。
在**“用户界面编辑器”中,选择“安装”下面的“启动”**节点。
在**“操作”菜单上选择“添加对话框”**。
在**“添加对话框”对话框中,选择“文本框 (A)”对话框,然后单击“确定”**。
在**“操作”菜单上选择“上移”,重复该操作直到“文本框 (A)”对话框位于“安装地址”**对话框之上。
在**“属性”**窗口中,设置下列属性:
Property
值
BannerText
键入服务器名称和服务名
Edit1Label
服务器名:
Edit1Value
本地主机
注意指定默认服务器。您可以在这里键入自己的默认服务器名。Edit2Label
服务名:
Edit2Value
<服务的名称>
Edit3Visible
False
Edit4Visible
False
注意 Edit1Property 属性被设置为“EDITA1”,而 Edit2Property 属性被设置为“EDITA2”。 它们对应于您在自定义操作编辑器的 CustomActionData 属性中键入的值。 安装期间当用户在这些编辑控件中键入文本时,这些值会通过 CustomActionData 属性自动传递。
生成和部署应用程序
最后的步骤是生成安装项目以创建安装程序,然后将应用程序安装在目标服务器上。
生成安装项目
- 在**“生成”菜单上选择“生成 Projectname”**,其中项目名称 是安装项目的名称。
将应用程序部署到开发计算机上的 Web 服务器上
在**“解决方案资源管理器”**中选择安装项目。
在**“项目”菜单上单击“安装”**。
将应用程序部署到另一台计算机上的 Web 服务器
在**“Windows 资源管理器”中,定位到项目目录并找到生成的安装程序。 默认路径将为 \documents and settings\您的登录名\My Documents\Visual Studio Projects\安装项目名称\项目配置\产品名称.msi。 默认项目配置 为“调试”**。
将该目录中的 .msi 文件以及其他所有文件和子目录复制到 Web 服务器计算机上。
在 Web 服务器计算机上,双击 Setup.exe 文件运行安装程序。