博客【张光见】

胸纳幽兰,神容略若---张若兰

博客园 首页 新随笔 联系 订阅 管理

摘要:本文演示了如何使用安装程序类或脚本来设置 Web 安装项目未公开的 Internet 信息服务 (IIS) 设置。

*
本页内容
简介 简介
创建 Web 项目 创建 Web 项目
使用托管安装程序类设置 IIS 属性 使用托管安装程序类设置 IIS 属性
向解决方案添加 Web 安装项目 向解决方案添加 Web 安装项目
向 Web 安装项目添加项目输出 向 Web 安装项目添加项目输出
将安装程序类添加为自定义操作 将安装程序类添加为自定义操作
基于用户输入设置 IIS 属性 基于用户输入设置 IIS 属性
小结 小结

简介

Microsoft?Visual Studio?.NET 中的 Web 安装项目将 Internet 信息服务的 Web 文件夹的大多数常见设置作为文件属性予以公开;然而,并非所有在安装 Web 应用程序时可能需要修改的设置或属性都被公开。例如,有必要关闭对 ASP.NET Web 应用程序进行的匿名访问,以确定 Web 客户端的用户名,但 Web 安装项目并未公开 AuthAnonymous 属性。可以在安装过程中使用自定义操作来设置这些附加属性。

Internet 信息服务 (IIS) 通过 IIS 对象揭示了这些属性中的大多数。有关这些 IIS 对象和属性的信息包含在 Visual Studio .NET 文档中,通过在索引中搜索 IIS Admin Objects:reference 即可找到。

本文提供了使用托管安装程序类和 Visual Basic?.NET 的代码示例。该托管安装程序类的代码可以用 Visual Studio .NET 所支持的任何语言编写的代码代替。如果不使用安装程序类,还可以使用脚本语言(如 VBScript)编写自定义操作。脚本自定义操作的功能较弱,调试起来更为困难,但可将其用于公共语言运行库不可用的安装(例如,C++ ATL Web Server 项目)。

代码示例使用语法 IISVdir.AuthAnonymous = False 来修改 AuthAnonymous 属性。如果要设置其他属性,可以基于文档更改这些代码以设置相应的属性。代码示例使用 SetInfo 方法向服务器提交更改。

安装过程中显示的“Installation Address”对话框使安装用户可以指定用于安装 Web 应用程序的虚拟目录和端口。在 Windows?2000 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 AuthAnonymous 属性的代码。下面的步骤将创建一个安装程序类,添加用于设置 IIS 属性的代码,提供一个 FindServerNum 函数以对服务器进行循环访问并查找安装了 Web 应用程序的端口。

向 Web 应用程序项目添加安装程序类

添加安装程序类

1.

Project 菜单上,选择 Add New Item

2.

Add New Item 对话框中,双击 Installer Class,将类添加到项目中。

3.

添加以下过程以覆盖基类的 Install 过程:

Public Overrides Sub Install(ByVal stateSaver As _
System.Collections.IDictionary)
    Dim strVDir As String = Me.Context.Parameters.Item("VDir")
    Dim intServerNum As Integer = _
    Me.FindServerNum(Me.Context.Parameters.Item("Port"))
    Dim strObjectPath As String = "IIS://" & _
    System.Environment.MachineName & "/W3SVC/" & _
    intServerNum.ToString & "/ROOT/" & strVDir
    Dim IISVdir As Object
    ' Gets the IIS VDir Object.
    IISVdir = GetIISObject(strObjectPath)
    ' Set the AuthAnonymous property here.
    IISVdir.AuthAnonymous = False
    ' Uses SetInfo to save the settings to the Server.
    IISVdir.SetInfo()
End Sub

4.

Install 过程后且 End Class 语句前添加以下函数:

Public Function FindServerNum(ByVal strPort As String) As Integer
    Const MD_SERVER_STATE_STARTED = 2
    Dim MachineName As String
    Dim IISObjectPath As String
    Dim IISObject As Object
    Dim ChildObject As Object
    Dim ChildObjectName As String
    Dim Servers As New Collection()
    Dim ServerNum As Integer
    Dim i As Integer
    Dim strBindings As String
    Dim strSvrPort As String
    Dim BindArray As Array
    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.AdsPath
        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.Add(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.
        BindArray = IISObject.ServerBindings
        strBindings = BindArray(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_STATE_STARTED 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 Active Servers with _
            " & "the requested port were found. Port=" & strPort & _
            ". ")
        Case 1
            Return Servers(1)
        Case Else
            Err.Raise(9999, "FindServerNum", "More than one Active _
            servers with the requested port were found. Port=" & _
            strPort & ". ")
    End Select
End Function
Private Function GetIISObject(ByVal strFullObjectPath As String) As Object
    Dim IISObject As Object
    Try
        IISObject = GetObject(strFullObjectPath)
        Return IISObject
    Catch exp As 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.

Add 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 ApplicationFolder

2.

Action 菜单上,指向 Add,然后选择 Project Output

3.

Add Project Output Group 对话框中,从 Project 下拉列表中选择您的 Web 应用程序。

4.

从该列表中选择 Primary OutputContent Files 组,然后单击 OK

将安装程序类添加为自定义操作

通过自定义操作,可以在安装结束后运行代码,以执行安装程序无法完成的操作,例如设置 Web 安装项目未公开的 IIS 属性。在此情况下,将要运行的自定义操作是安装程序类,它包含在 Web 应用程序项目的主输出中。

添加自定义操作

在解决方案资源管理器中选择 Web 安装项目。

View 菜单上,指向 Editor,然后选择 Custom Actions

在自定义操作编辑器中,选择 Install 节点。在 Action 菜单上,选择 Add Custom Action

Select Item in Project 对话框中,双击 Web Application Folder

选择 Primary output from WebApp (Active) 项,其中 WebApp 是 Web 应用程序的名称,然后单击“OK”。

配置自定义操作

为了设置 IIS 属性,自定义操作需要知道将要安装该应用程序的虚拟目录和端口。这可以使用 CustomActionData 属性来实现。

置自定义操作

在自定义操作编辑器中,选择在上一步中添加的自定义操作。

在“Properties”窗口中,选择 CustomActionData 属性,然后键入

/VDIR=[TARGETVDIR] /PORT=[TARGETPORT]。

这会指定 CustomActionData 属性将返回一个字符串,其中包含用户在安装过程中输入的虚拟目录([TARGETVDIR] 属性)和端口([TARGETPORT] 属性)。

此时,您便准备好生成 Web 安装项目并安装您的 Web 应用程序了。下一部分将演示使应用程序安装人员可以在安装过程中选择 IIS 设置的其他步骤。

基于用户输入设置 IIS 属性

本节基于上述步骤,进一步演示可用来针对其他 IIS 设置接受用户输入的其他步骤。在此情况下,您将显示一个对话框,使用户可以决定是否启用 ASP 缓冲。ASP 缓冲确定是否必须在显示 Web 页之前完成对该页的处理。

添加自定义用户界面对话框

自定义用户界面对话框用于在安装过程中收集用户输入。在此情况下,您将使用一个对话框向用户提供复选框。该对话框将在安装过程中恰好于 Installation Address 对话框之前显示。

创建自定义安装对话框

1.

在解决方案资源管理器中选择 Web 安装项目。

2.

View 菜单上,指向 Editor,然后选择 User Interface

3.

在用户界面编辑器中,选择 Install 下的 Start 节点。在 Action 菜单上,选择 Add Dialog

4.

Add Dialog 对话框中,双击 Checkboxes (A) 对话框。

5.

Action 菜单上,选择 Move Up。重复执行该操作,直至 Checkboxes (A) 对话框位于 Installation Address 节点上方。

6.

在“Properties”窗口中,设置下列属性:

属性 设置 说明

BannerText

Web 站点配置

指定要在该对话框的标题区显示的文本。

BodyText

选择该应用程序的 IIS 设置

指定要在对话框的正文显示的文本。

Checkbox1Label

启用 ASP 缓冲

指定对话框中第一个 CheckBox 控件的标签文本。

Checkbox 2Visible

false

隐藏第二个 CheckBox 控件。

Checkbox 3Visible

false

隐藏第三个 CheckBox 控件。

Checkbox 4Visible

false

隐藏第四个 CheckBox 控件。

编辑安装程序类代码

下一步是修改安装程序类中用于更新 Buffering 属性的代码。

修改安装程序类

1.

在解决方案资源管理器中选择安装程序类 (Installer.vb),然后按 F7 打开代码编辑器。

2.

在安装过程中,找到内容为 Dim IISVdir As Object 的行。

3.

在该行下面,紧接着添加以下代码:

Dim blnBuffering As Boolean
If Context.Parameters.Item("BUFFERING") = "1" Then
    blnBuffering = true
Else 
    blnBuffering = false
End If

4.

找到内容为 IISVdir.AuthAnonymous = False 的行。

5.

在该行下面,紧接着添加以下代码:

IISVdir.AspBufferingOn = blnBuffering

修改自定义操作

最后一步是修改自定义操作的 CustomActionData 属性,以包含由自定义对话框的 Checkbox1Property 属性返回的值。

修改自定义操作

1.

在解决方案资源管理器中选择 Web 安装项目,然后打开自定义操作编辑器。

2.

在自定义操作编辑器中,选择在前面添加的自定义操作。

3.

在“Properties”窗口中,选择 CustomActionData 属性,然后键入

/VDIR=[TARGETVDIR] /PORT=[TARGETPORT] /BUFFERING=[CHECKBOXA1]。

这会将复选框([CHECKBOXA1] 属性)的值添加到由 CustomActionData 属性返回的字符串中。

此时,您再一次准备好生成 Web 安装项目并安装您的 Web 应用程序。在安装过程中,您将看到自定义的 Web Site Configuration 对话框,其中包含 Enable ASP Buffering 复选框,使您可以指定 IIS Buffering 属性的设置。安装完成后,您可以在服务器上检查 IIS 设置,以验证属性的设置是否正确。

小结

尽管 Web 安装项目并未公开所有 IIS 属性,但通过自定义操作来设置 IIS 属性还是比较容易的。虽然本文只演示了两个属性,但您可以修改前面的代码来处理任何 IIS 对象的任何属性。阿

posted on 2004-06-28 10:50  willpower  阅读(403)  评论(0编辑  收藏  举报