简介
Microsoft Visual Studio .NET中的Web安装项目将Internet信息服务的Web文件夹的大多数常见设置作为文件属性予以公开;然而,并非所有在安装Web应用程序时可能需要修改的设置或属性都被公开。例如,有必要关闭对
A
SP.NET Web应用程序进行的匿名访问,以确定Web客户端的用户名,但Web安装项目并未公开
A
uth
A
nonymous属性。可以在安装过程中使用自定义操作来设置这些附加属性。
Internet信息服务(IIS)通过IIS对象揭示了这些属性中的大多数。有关这些IIS对象和属性的信息包含在Visual Studio .NET文档中,通过在索引中搜索“IIS
A
dmin Objects: reference”即可找到。
本文提供了使用托管安装程序类和Visual Basic.NET的代码示例。该托管安装程序类的代码可以用Visual Studio .NET所支持的任何语言编写的代码代替。如果不使用安装程序类,还可以使用脚本语言(如VBScript)编写自定义操作。脚本自定义操作的功能较弱,调试起来更为困难,但可将其用于公共语言运行库不可用的安装(例如,C++
A
TL Web Server项目)
代码示例使用语法“IISVdir.
A
uth
A
nonymous = False”来修改
A
uth
A
nonymous属性。如果要设置其他属性,可以基于文档更改这些代码以设置相应的属性。代码示例使用SetInfo方法向服务器提交更改。
安装过程中显示的“Installation Address”对话框使安装用户可以指定用于安装Web应用程序的虚拟目录和端口。在“Windows2000 Server”和“Windows Server 2003”中,多个Web服务器可以驻留在一台计算机上。Web安装程序只能安装到TCP端口上的活动Web服务器。因此,“Installation Address”对话框中的Port属性标识了在其上创建虚拟目录的Web服务器。自定义操作或脚本必须能够基于端口,标识正确的Web服务器。
所包含的附加示例,演示了如何在安装过程中显示一个对话框,使用户可以选择要设置的附加IIS属性。
创建Web项目
为了在部署期间修改IIS设置,首先必须拥有要部署的Web应用程序。您可以使用已用Visual Studio .NET创建的任何Web应用程序,或者您可以按照下面的说明创建一个空的Web应用程序。
创建Web应用程序项目
1.在File菜单上,选择New,然后单击Project,将显示New Project对话框。
2.在Project Types窗格中,选择Visual Basic或Visual C#。
3.在Templates窗格中,选择Empty Web Project。
4.在Location文本框中,指定要放置该Web项目的URL(包括您要为它提供的名称)。
5.单击OK按钮创建该Web项目。
Visual Studio将连接到服务器,并且向项目节点中的解决方案资源管理器中添加相应的项目项。
使用托管安装程序类设置IIS属性
托管安装程序类(也称为安装组件)使您可以设置将在部署应用程序时发生的自定义操作。在该示例中,使用了托管安装程序类来公开可设置IIS
A
uth
A
nonymous属性的代码。下面的步骤将创建一个安装程序类,添加用于设置IIS属性的代码,提供一个FindServerNum函数对服务器进行循环访问,并查找安装了Web应用程序的端口。
向Web应用程序项目添加安装程序类
添加安装程序类
1.在Project菜单上,选择
A
dd New Item。
2.在
A
dd New Item对话框中,双击Installer Class,将类添加到项目中。
3.添加以下过程以覆盖基类的Install过程:
Public Overrides Sub Install(ByVal stateSaver
A
s _
System.Collections.IDictionary)
Dim strVDir
A
s String = Me.Context.Parameters.Item("VDir")
Dim intServerNum
A
s Integer = _
Me.FindServerNum(Me.Context.Parameters.Item("Port"))
Dim strObjectPath
A
s String = "IIS://" & _
System.Environment.MachineName & "/W3SVC/" & _
intServerNum.ToString & "/ROOT/" & strVDir
Dim IISVdir
A
s Object
' Gets the IIS VDir Object.
IISVdir = GetIISObject(strObjectPath)
' Set the
A
uth
A
nonymous property here.
IISVdir.
A
uth
A
nonymous = False
' Uses SetInfo to save the settings to the Server.
IISVdir.SetInfo()
End Sub
4.在Install过程后且End Class语句前添加以下函数:
Public Function FindServerNum(ByVal strPort
A
s String)
A
s Integer
Const MD_SERVER_ST
A
TE_ST
A
RTED = 2
Dim MachineName
A
s String
Dim IISObjectPath
A
s String
Dim IISObject
A
s Object
Dim ChildObject
A
s Object
Dim ChildObjectName
A
s String
Dim Servers
A
s New Collection()
Dim ServerNum
A
s Integer
Dim i
A
s Integer
Dim strBindings
A
s String
Dim strSvrPort
A
s String
Dim Bind
A
rray
A
s
A
rray
MachineName = System.Environment.MachineName
IISObjectPath = "IIS://" & MachineName & "/W3SVC"
' Iterates through the W3SVC folder to get the name of
' each child object.
IISObject = GetIISObject(IISObjectPath)
For Each ChildObject In IISObject
ChildObjectName = ChildObject.
A
dsPath
ChildObjectName = Right(ChildObjectName, Len(ChildObjectName) _
- InStrRev(ChildObjectName, "/"))
Try
' If the name can be converted to an integer (port number),
' add it to the Servers collection.
ServerNum = CType(ChildObjectName, Integer)
Servers.
A
dd(ServerNum)
Catch
' If the name cannot be converted to an integer,
' it isn't a port and can be ignored.
End Try
Next
' Iterates through each server, removing each inactive server
' without the correct port.
For i = Servers.Count To 1 Step -1
IISObjectPath = "IIS://" & MachineName & "/W3SVC/" & _
Servers(i)
IISObject = GetIISObject(IISObjectPath)
' Gets the Port Number of the current IISObject.
Bind
A
rray = IISObject.ServerBindings
strBindings = Bind
A
rray(0)
strSvrPort = Left(strBindings, InStrRev(strBindings, _
":") - 1)
strSvrPort = Right(strSvrPort, Len(strSvrPort) - _
InStr(strSvrPort, ":"))
' Determines if this is our server. IIS can only have one
' active port, so if the port is active it is the port where
' the application is installed.
If strPort = strSvrPort Then
If IISObject.ServerState = MD_SERVER_ST
A
TE_ST
A
RTED Then
Return Servers(i)
End If
Else
' Not the active Port, so remove it from the
' collection.
Servers.Remove(i)
End If
Next
' Checks how many servers are left. If one, we've found it
' otherwise, report an error.
Select Case Servers.Count
Case 0
Err.Raise(9999, "FindServerNum", "No
A
ctive Servers with _
" & "the requested port were found. Port=" & strPort & _
". ")
Case 1
Return Servers(1)
Case Else
Err.Raise(9999, "FindServerNum", "More than one
A
ctive _
servers with the requested port were found. Port=" & _
strPort & ". ")
End Select
End Function
Private Function GetIISObject(ByVal strFullObjectPath
A
s String)
A
s Object
Dim IISObject
A
s Object
Try
IISObject = GetObject(strFullObjectPath)
Return IISObject
Catch exp
A
s Exception
Err.Raise(9999, "GetIISObject", "Error opening: " _
& strFullObjectPath & ". " & exp.Message)
End Try
End Function
向解决方案添加Web安装项目
可使用Web安装项目,创建用于在Web服务器上安装Web应用程序的Windows安装程序(.msi)文件。
添加Web安装项目
1.在File菜单上,选择Add Project,然后选择New Project。
2.在
A
dd New Project对话框中,选择Project Type窗格中的Setup and Deployment Projects,然后选择Templates窗格中的Web Setup Project。在Name框中,键入Web应用程序和Setup的名称。
该项目即被添加到解决方案资源管理器中,并且将打开文件系统编辑器。
3.在Properties窗口中,选择ProductName属性,并键入Web应用程序的名称。
向Web安装项目添加项目输出
下一步是通过添加项目输出将Web应用程序与Web安装项目关联起来。这种情况下,项目输出包括Web应用程序、所有内容文件以及托管安装程序类。
添加项目输出
1.在文件系统编辑器中,选择Web
A
pplication Folder。
2.在
A
ction菜单上,选择Add,然后选择Project Output。
3.在
A
dd Project Output Group对话框中,从Project下拉列表中选择您的Web应用程序。
4.从该列表中选择Primary Output和Content Files组,然后单击OK按钮。
将安装程序类添加为自定义操作
通过自定义操作,可以在安装结束后运行代码,以执行安装程序无法完成的操作,例如设置Web安装项目未公开的IIS属性。在此情况下,将要运行的自定义操作是安装程序类,它包含在Web应用程序项目的主输出中。
添加自定义操作
1.在解决方案资源管理器中选择Web安装项目。
2.在View菜单上,选择Editor,然后选择Custom
A
ctions。
3.在自定义操作编辑器中,选择Install节点。在
A
ction菜单上,选择
A
dd Custom
A
ction。
4.在Select Item in Project对话框中,双击Web
A
pplication Folder。
5.选择Primary output from Web
A
pp (
A
ctive)项,其中Web
A
pp是Web应用程序的名称,然后单击OK按钮。
配置自定义操作
为了设置IIS属性,自定义操作需要知道将要安装的应用程序的虚拟目录和端口。这可以使用Custom
A
ctionData属性来实现。
配置自定义操作
1.在自定义操作编辑器中,选择在上一步中添加的自定义操作。
2.在Properties窗口中,选择Custom
A
ctionData属性,然后键入“/VDIR=[T
A
RGETVDIR] /PORT=[T
A
RGETPORT]”。
这会指定Custom
A
ctionData属性返回一个字符串,其中包含用户在安装过程中输入的虚拟目录([T
A
RGETVDIR]属性)和端口([T
A
RGETPORT]属性)。
此时,您便准备好生成Web安装项目,并可安装您的Web应用程序了。下一部分将演示其他步骤,这可以让应用程序安装人员在安装过程中选择IIS设置。
基于用户输入设置IIS属性
本节基于上述步骤,进一步演示如何接受用户对IIS设置输入的步骤。在此情况下,您将显示一个对话框,使用户可以决定是否启用
A
SP缓冲。
A
SP缓冲确定是否必须在显示Web页之前完成对该页的处理。
添加自定义用户界面对话框
自定义用户界面对话框用于在安装过程中收集用户输入。在此情况下,您将使用一个对话框向用户提供复选框。该对话框将在安装过程中恰好于Installation
A
ddress对话框之前显示。
创建自定义安装对话框
1.在解决方案资源管理器中选择Web安装项目。
2.在View菜单上,指向Editor,然后选择User Interface。
3.在用户界面编辑器中,选择Install下的Start节点。在
A
ction菜单上,选择
A
dd Dialog。
4.在
A
dd Dialog对话框中,双击Checkboxes (
A
)对话框。
5.在
A
ction菜单上,选择Move Up。重复执行该操作,直至Checkboxes (
A
)对话框位于Installation
A
ddress节点上方。
6.在"Properties"窗口中,设置下列属性:
|
属性
|
设置
|
说明
|
|
BannerText
|
Web站点配置
|
指定要在该对话框的标题区显示的文本。
|
|
BodyText
|
选择该应用程序的IIS设置
|
指定要在对话框的正文显示的文本。
|
|
Checkbox1Label
|
启用
A
SP缓冲
|
指定对话框中第一个CheckBox控件的标签文本。
|
|
Checkbox 2Visible
|
false
|
隐藏第二个CheckBox控件。
|
|
Checkbox 3 Visible
|
false
|
隐藏第三个CheckBox控件。
|
|
Checkbox 4Visible
|
false
|
隐藏第四个CheckBox控件。
|
编辑安装程序类代码
下一步是修改安装程序类中用于更新Buffering属性的代码。
修改安装程序类
1.在解决方案资源管理器中选择安装程序类(Installer.vb),然后按F7打开代码编辑器。
2.在安装过程中,找到内容为“Dim IISVdir
A
s Object”的行。
3.在该行下面,紧接着添加以下代码:
Dim blnBuffering
A
s Boolean
If Context.Parameters.Item("BUFFERING") = "1" Then
blnBuffering = true
Else
blnBuffering = false
End If
4.找到内容为“IISVdir.
A
uth
A
nonymous = False”的行。
5.在该行下面,紧接着添加以下代码:
IISVdir.
A
spBufferingOn = blnBuffering
修改自定义操作
最后一步是修改自定义操作的Custom
A
ctionData属性,以包含由自定义对话框的Checkbox1Property属性返回的值。
修改自定义操作
1.在解决方案资源管理器中选择Web安装项目,然后打开自定义操作编辑器。
2.在自定义操作编辑器中,选择在前面添加的自定义操作。
3.在Properties窗口中,选择Custom
A
ctionData属性,然后键入“/VDIR=[T
A
RGETVDIR] /PORT=[T
A
RGETPORT] /BUFFERING=[CHECKBOX
A
1]”。
这会将复选框([CHECKBOX
A
1]属性)的值添加到由Custom
A
ctionData属性返回的字符串中。
此时,您再一次准备好生成Web安装项目并安装您的Web应用程序。在安装过程中,您将看到自定义的Web Site Configuration对话框,其中包含Enable
A
SP Buffering复选框,使您可以指定IIS Buffering属性的设置。安装完成后,您可以在服务器上检查IIS设置,以验证属性的设置是否正确。
小结
尽管Web安装项目并未公开所有IIS属性,但通过自定义操作来设置IIS属性还是比较容易的。虽然本文只演示了两个属性,但您可以修改前面的代码来处理任何IIS对象的任何属性。 |