2002-09-17 09:27
在安装期间将应用程序重定向到不同的XML Web services
Steve Hoag
Visual Studio Team
Microsoft
Corporation
2001 年 11 月
摘要:本文介绍了如何在 Visual Basic? .NET 中创建一个 Web 应用程序,通过使用 URL Behavior 属性、Installer 类和 Web 安装程序项目将该应用程序重定向到不同的 XML Web services。
简介
在开发以 XML Web services
为目标的应用程序时,通常应该以 Web 服务器上已安装的 XML Web services
为目标。这是一个准则,不过在部署应用程序的产品版本时,有时也需要以其他 XML Web services 为目标。例如,您可能已将开发服务器上的 XML Web
services 的测试版本作为目标,但是完成的应用程序需要将另一个服务器上的 XML Web services
的安装版本作为目标。您可能还希望安装该应用程序的人员在安装期间可以选择 XML Web services 的版本,例如,Intranet
上的版本或者是可以从防火墙外部进行访问的版本。
本文介绍了如何创建可以重定向到不同的 XML Web services 的 Web 应用程序。创建过程包括:
指定 URL Behavior 属性,以在运行时查找 XML Web services。
添加能在安装结束时执行自定义操作的安装组件。
使用安装程序项目为应用程序创建一个包含自定义用户界面的安装程序。
第一步是创建包含对 XML Web services 进行 Web
引用的 Web 应用程序。有关创建 Web 应用程序的详细信息,请参阅 Visual Studio? .NET 文档中的 Walkthrough:
Creating an XML Web services Using Visual Basic or Visual C#(英文)。
将 URL Behavior 设置为 Dynamic
为了在运行时查找 XML
Web services,应用程序将存储该 XML Web services 的 URL。Web 引用(用于 XML Web services)的 URL
Behavior 属性决定 URL 的存储位置。如果 URL Behavior 属性被设置为 Static(默认值),则 URL 将被硬编码为 Web
引用的一部分。如果 URL Behavior 属性被设置为 Dynamic,则指定 URL 的条目将被添加到该应用程序的 Web.config 文件的
appSettings 段。
将 URL Behavior 属性设置为 Dynamic
在 Solution Explorer(解决方案资源管理器)中,展开 Web References(Web 引用)节点并选择对
XML Web services 的引用。
在 Properties(属性)窗口中,选择 URL Behavior 属性并将其更改为
Dynamic。
在 Solution Explorer(解决方案资源管理器)中,选择 Web.config
文件并双击以打开该文件。
在该文件末尾,应该能够找到一个
value=http://localhost/MyWebService/Service1.asmx/>
下一步是添加 Installer 类,用于在安装期间修改 .config 文件。
添加 Installer 类
Installer
类(也称为安装组件)是在安装过程中被当作自定义操作调用的 .NET 框架类。在这种情况下,您需要添加 Installer 类来代替 Install
方法,以添加修改 .config 文件的代码。有关 Installer 类的详细信息,请参阅 Visual Studio .NET
文档中的“Introduction to Installation Components”。
添加 Installer 类
在 Project(项目)菜单中,选择 Add New Item(添加新项)。
在 Add New
Item(添加新项)对话框中,选择 Installer Class(Installer 类)并将 Name(名称)更改为
WebServiceInstaller。
单击 Open(打开)后,该类将被添加到您的项目,并打开包含
Installer 类的设计器。
双击设计器以打开 Code Editor(代码编辑器)。
在 Installer 类模块(位于 End
Class 声明的上面)的底部添加用于 Install 方法的以下代码:
Public Overrides Sub Install(ByVal
stateSaver As
System.Collections.IDictionary)
' 获取在
CustomActionData 中传递的参数。
Dim installlog As New
System.IO.StreamWriter("Installation.log")
installlog.AutoFlush
= True
Try
Dim ProvidedName As
String
=Me.Context.Parameters.Item("ServerName")
Dim SvcName As String =
Me.Context.Parameters.Item("ServiceName")
installlog.WriteLine("开始编辑配置文件")
If ProvidedName = "" Or SvcName =
"" Then
Throw New
InstallException("未指定参数")
End If
' 使用反射查找配置文件的位置。
Dim Asm As System.Reflection.Assembly =
System.Reflection.Assembly.GetExecutingAssembly
Dim strConfigLoc As String
strConfigLoc = Asm.Location
Dim strTemp As
String
strTemp =
strConfigLoc
strTemp =
strTemp.Remove(strTemp.LastIndexOf("\"),
Len(strTemp) –
strTemp.LastIndexOf("\"))
strTemp =
strTemp.Remove(strTemp.LastIndexOf("\"),
Len(strTemp) –
strTemp.LastIndexOf("\"))
Dim FileInfo As
System.IO.FileInfo =
New System.IO.FileInfo(strTemp &
"\web.config")
installlog.WriteLine("文件信息:" & strTemp)
If Not FileInfo.Exists
Then
Throw New
InstallException("缺少配置文件")
End If
' 将配置文件加载到 XML
DOM。
Dim XmlDocument As New
System.Xml.XmlDocument()
XmlDocument.Load(FileInfo.FullName)
'
找到正确的节点并将其更改为新值。
Dim Node As
System.Xml.XmlNode
Dim FoundIt As Boolean =
False
For Each Node In
XmlDocument.Item("configuration").Item("appSettings")
' 忽略所有注释。
If Node.Name =
"add" Then
If Node.Attributes.GetNamedItem("key").Value =
"appname.servername.service"
Then
'
注意,“Service1.asmx”应当被替换为
' Web service
文件的实际名称。
Node.Attributes.GetNamedItem("value").Value =
"http:\\" & ProvidedName & "\" &
SvcName &
"\Service1.asmx"
FoundIt =
True
End
If
End
If
Next Node
If Not FoundIt
Then
Throw New
InstallException("配置文件不
包含
ServerName 段")
End If
'
编写新的配置文件。
XmlDocument.Save(FileInfo.FullName)
Finally
installlog.WriteLine("结束对配置文件的编辑")
installlog.Close()
End Try
End Sub
以上代码首先创建用于记录自定义操作进度的安装日志文件。System.Reflection
命名空间用于查找所安装的程序集并查找关联的 .config 文件。XML 文档模型用于遍历 .config 文件,直至找到 appSettings
段。找到关键字 appname.servername.service 后,其关联值将发生更改以包含传入的参数,从而将应用程序重定向为使用新的 XML Web
services。
在 Solution Explorer(解决方案资源管理器)中,选择 Web.config 文件并双击以打开该文件。
在 appSettings 段中复制 XML Web services 的关键字值。关键字的形式为
appname.servername.service,其中 appname 是应用程序的名称,servername 是 XML Web services
所在的服务器,service 是 XML Web services 的名称。
在 Code Editor(代码编辑器)中打开 Installer
类模块,并使用上一步中复制的值替换 appname.servername.service。
下一步是为应用程序添加一个安装程序项目。
添加安装程序项目
安装程序项目用于为应用程序创建安装程序。安装程序项目以 Windows
安装程序技术为基础,包含在安装期间运行自定义操作以及自定义安装用户界面等多项功能。有关安装程序项目的详细信息,请参阅 Visual Studio .NET
文档中的 Deploying Applications and Components(英文)。
添加安装程序项目
在 File(文件)菜单中,指向 Add Project(添加项目),然后单击 New Project(新建项目)。
在 Add New Project(添加新项目)对话框中,选择 Project Types(项目类型)窗格中的 Setup and
Deployment Projects(安装和部署项目)节点。
在 Templates(模板)窗格中,选择 Web Setup
Project(Web 安装程序项目)并单击 OK(确定)。
该项目将被添加到解决方案中,且 File System
Editor(文件系统编辑器)将被打开。
在 Properties(属性)窗口中,选择 ProductName 属性并将其名称设置为与应用程序的名称相同。
在 File System Editor(文件系统编辑器)中,选择 Web Application Folder(Web 应用程序文件夹)。
在 Action(操作)菜单中,指向 Add(添加),然后单击 Project Output(项目输出)。
在 Add
Project Output Group(添加项目输出组)对话框中,选择应用程序项目,然后选择 Primary Output(主输出)和 Content
Files(内容文件),并单击 OK(确定)。
下一步是添加将在安装结束时运行的自定义操作。
将 Installer
类添加为自定义操作
自定义操作用于在安装结束时运行代码,以便执行安装过程中无法处理的操作。自定义操作的代码可以包含在 .dll
文件、.exe 文件、脚本文件或程序集文件中。有关自定义操作的详细信息,请参阅 Visual Studio .NET 文档中的 Custom Actions
Management in Deployment(英文)。
将 Installer 类添加为自定义操作
在 Solution Explorer(解决方案资源管理器)中,选择 Setup Project(安装程序项目)。
在 View(视图)菜单中,指向 Editor(编辑器),然后单击 Custom Actions(自定义操作)。
Custom Actions Editor(自定义操作编辑器)将打开。
在 Custom Actions Editor(自定义操作编辑器)中,选择 Install(安装)节点。
在
Action(操作)菜单中,选择 Add Custom Action(添加自定义操作)。
双击 Web Application
Folder(Web 应用程序文件夹),然后选择 Primary output(主输出),并单击 OK(确定)。
在
Properties(属性)窗口中,选择 InstallerClass 属性并确保将其设置为 true。
选择 CustomActionData
属性并输入以下文本:/ServerName=[EDITA1] /ServiceName=[EDITA2]
CustomActionData 属性提供两个被传递到自定义操作的参数,参数之间用空格分隔。
下一步是添加用户界面以便在安装过程中输入信息。
添加用户界面对话框
安装过程中将显示用户界面对话框以便从用户收集信息。有关用户界面对话框的详细信息,请参阅 Visual Studio
.NET 文档中的 User Interface Management in Deployment(英文)。
添加自定义用户界面对话框
在 Solution Explorer(解决方案资源管理器)中,选择 Setup Project(安装程序项目)。
在 View(视图)菜单中,指向 Editor(编辑器),然后单击 User Interface(用户界面)。
在 User
Interface Editor(用户界面编辑器)中,选择 Start(开始)节点。
在 Action(操作)菜单中,选择 Add
Dialog(添加对话框)。
在 Add Dialog(添加对话框)对话框中,选择 Textboxes (A)(文本框 [A])对话框,然后单击
OK(确定)。
在 Action(操作)菜单中,选择 Move Up(上移)并重复执行该操作,直到 Textboxes (A)(文本框
[A])对话框位于 Installation Address(安装地址)对话框的上方。
在
Properties(属性)窗口中,设置以下属性:
属性 | 值 |
---|---|
BannerText | 输入服务器名称和服务名称 |
Edit1Label | 服务器名称: |
Edit1Value | Localhost
注意:此值指定默认服务器。您可以在此处输入自己的默认服务器名称。 |
Edit2Label | 服务名称: |
Edit2Value | <服务的名称> |
Edit3Visible | false |
Edit4Visible | false |
注意:Edit1Property 属性被设置为“EDITA1”,Edit2Property 属性被设置为“EDITA2”。这些值与在 Custom Actions Editor(自定义操作编辑器)的 CustomActionData 属性中输入的值相对应。如果用户在安装期间在这些编辑控件中输入文本,CustomActionData 属性将自动传递这些值。
生成和安装
最后一步是生成安装程序项目以创建安装程序,然后将应用程序安装到目标服务器上。
生成安装程序项目
在 Build(生成)菜单中,选择 Build Projectname(生成 Projectname),其中
Projectname 是您的安装程序项目的名称。
将应用程序部署到开发计算机的 Web 服务器上
在 Solution Explorer(解决方案资源管理器)中,选择安装程序项目,然后在 Project(项目)菜单中选择
Install(安装)。
将应用程序部署到其他计算机的 Web 服务器上
在 Windows 资源管理器中,浏览到项目目录,并找到生成的安装程序。默认路径为 \Documents and
settings\您的登录名\安装程序项目名\项目配置\产品名.msi。默认的项目配置为 Debug。
将目录中的 .msi
文件以及所有其他文件和子目录都复制到 Web 服务器。
在 Web 服务器上,双击 Setup.exe 文件以运行安装程序。
总结
我们可以看出,重定向应用程序以使用不同的 XML Web services 的过程并不难。虽然本例使用以 XML Web
services 为目标的 Web 应用程序,但您可以轻松地将其更改为用于 Windows 应用程序:只需要使用 app.config 文件代替
Web.config 文件,并使用安装程序项目代替 Web 安装程序项目。除此以外,过程完全相同。
本文介绍了几项新技术:使用 URL Behavior 属性在配置文件中存储信息,使用 Installer 类在安装期间执行操作,以及使用 CustomActionData 属性在安装过程中存储用户信息。