演练:在 IIS 7.0 中配置 ASP.NET 应用程序

更新:2007 年 11 月

如果 ASP.NET Web 应用程序以 IIS 7.0 为宿主,则可以用多种方式为该应用程序进行配置设置。这包括:

  • 使用 IIS 管理器。有关更多信息,请参见如何:打开 IIS 管理器Internet Information Services (IIS) Manager(Internet 信息服务 (IIS) 管理器)。

  • 直接编辑 Web.config 文件。可以在 Visual Studio 或 Visual Web Developer 中或通过使用文本编辑程序完成此任务。

  • 使用 IIS 7.0 命令行工具 (Appcmd.exe)。使用此实用工具,可以指定 IIS 配置设置和 Web 应用程序配置设置。有关更多信息,请参见 IIS 7.0 Command-Line Tool(IIS 7.0 命令行工具)。

  • 使用 Windows Management Instrumentation (WMI)。IIS 7.0 WMI 提供程序 WebAdministration 命名空间包含相应的类和方法,可用来为网站、Web 应用程序及其关联对象和属性的管理任务创建脚本。有关更多信息,请参见 IIS 7.0: WMI(IIS 7.0:WMI)。

IIS 7.0 具有模块化体系结构,使您能够指定哪些模块组成 Web 服务器的功能。安装 IIS 7.0 时,默认情况下很多模块未启用。当您使用 ASP.NET 网站时,可能需要启用下列模块:

  • IIS 6 管理兼容性模块,它使 Visual Studio 能够使用元数据库调用与 IIS 7.0 配置存储区进行交互。

  • Windows 身份验证模块,它使您能够在 Visual Studio 中调试 Web 应用程序。

有关更多信息,请参见在装有 IIS 7.0 和 Visual Studio 的 Windows Vista 上运行 Web 应用程序在装有 IIS 7.0 和 Visual Studio 的 Windows Server 2008 上运行 Web 应用程序

在本演练中,您将使用 IIS 管理器进行配置设置,然后查看这些设置如何反映在 Web 应用程序的 Web.config 文件中。本演练中阐释的任务包括:

  • 创建一个自定义托管代码模块,并且将该模块放在 Web 应用程序的 App_Code 目录中。

  • 使用 IIS 管理器注册该自定义模块。

  • 使用 IIS 管理器添加自定义 HTTP 标头。

该模块的功能在本演练中并不重要。本演练要演示的是如何将该模块集成到请求管道中,以及使用 IIS 管理器配置应用程序会对 Web.config 文件造成怎样的影响。

先决条件

若要完成本演练,您需要:

  • 在 Windows Vista 或 Windows Server 2008 上安装并运行 IIS 7.0。

  • 至少一个在 IIS 7.0 集成模式下运行的应用程序池。

  • 在 IIS 7.0 中启用**“IIS 6 管理兼容性”**模块。

  • Visual Studio 2008。

  • .NET Framework 3.0 版 或更高版本。

  • 对计算机的管理权限。

  • 一个用来检查计算机和 Web 服务器之间的 HTTP 请求和响应的工具,例如 Fiddler 工具。可以从 Fiddler Web Debugging Proxy(Fiddler Web 调试代理)网站下载该工具。

    Bb763174.alert_note(zh-cn,VS.90).gif说明:

    Fiddler 是一个 Microsoft 不支持的第三方工具。

创建自定义 HTTP 模块

首先,您需要创建一个新网站。

创建新的网站

  1. 在 Visual Studio 中,创建一个新的名为“WalkthroughIIS7”的本地 HTTP 网站。

    有关如何创建本地 IIS 网站的信息,请参见演练:在 Visual Web Developer 中创建本地 IIS 网站

  2. 在**“开始”菜单上,依次单击“所有程序”“附件”“运行”**。

  3. 在**“打开”框中,键入 inetmgr,然后单击“确定”**。

    Bb763174.alert_note(zh-cn,VS.90).gif说明:

    如果启用了用户帐户控制 (UAC),则当您试图访问 IIS 管理器时,它可能会显示一个消息。如果是这样,请单击“继续”。有关更多信息,请参见 User Account Control(用户帐户控制)。

  4. 验证该网站位于在集成模式下运行的应用程序池中。

    有关如何设置 Web 应用程序模式的信息,请参见 Configure the Request-Processing Mode for an Application Pool(为应用程序池配置请求处理模式)。

您现在可以创建自定义 HTTP 模块了。

创建自定义 HTTP 模块

  1. 在 Visual Studio 的**“解决方案资源管理器”中,右击 Web 项目节点,再单击“添加新项”**。

    显示**“添加新项”**对话框。

  2. 在**“Visual Studio 已安装的模板”下选择“类”**。

  3. 选择您想使用的编程语言。

  4. 输入“CustomModule”作为类名,然后单击**“添加”**。

    如果网站尚未包含 App_Code 文件夹,此时将显示一个消息,询问您是否要将该类放在 App_Code 文件夹中。如果答案是肯定的,请单击**“是”**。

  5. 在类文件中,移除现有代码,并用下面的代码替换之:

    Imports System
    Imports System.Configuration
    Imports System.Web
    Imports System.Web.Security
    Imports System.Web.UI
    
    Public Class CustomModule
        Implements IHttpModule
    
        Public Sub New()
            ' Constructor
        End Sub
    
        Public Sub Init(ByVal app As HttpApplication) Implements IHttpModule.Init
            AddHandler app.BeginRequest, AddressOf Me.BeginRequest
        End Sub
    
    
        Public Sub BeginRequest(ByVal source As Object, ByVal e As EventArgs)
            Dim app As HttpApplication = CType(source, HttpApplication)
            Dim cont As HttpContext = app.Context
            Dim notification As String = cont.CurrentNotification.ToString()
            Dim postNotification As String = cont.IsPostNotification.ToString()
            cont.Response.Headers.Set("CustomHeader2", "ASPX, Event = " & notification & _
                    ", PostNotification = " & postNotification + _
                    ", DateTime = " & DateTime.Now.ToString())
    
        End Sub
    
        Public Sub Dispose() Implements IHttpModule.Dispose
        End Sub
    End Class
    
    using System;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    
    public class CustomModule : IHttpModule
    {
        public CustomModule()
        {
            // Constructor
        }
        public void Init(HttpApplication app)
        {
            app.BeginRequest += new EventHandler(BeginRequest);
        }
        public void BeginRequest(object source, EventArgs e)
        {
    
            HttpApplication app = (HttpApplication)source;
            HttpContext cont = app.Context;
            string notification = cont.CurrentNotification.ToString();
            string postNotification = cont.IsPostNotification.ToString();
            cont.Response.Headers.Set("CustomHeader2", "ASPX, Event = " + notification +
                    ", PostNotification = " + postNotification +
                    ", DateTime = " + DateTime.Now.ToString());
    
        }
        public void Dispose()
        {
        }
    }
    

    这段代码执行下面的操作:

    • 定义一个实现 IHttpModule 接口的自定义托管代码模块。

    • HttpApplication 实例的 BeginRequest 事件定义一个事件处理程序。该事件处理程序定义了一个要添加到响应头集合中的自定义标头。

    • 在模块的 Init 方法中,将该处理程序添加到通知请求管道中。

    因为该类实现了 IHttpModule 接口,所以该类必须实现 Init 方法和 Dispose 方法。此模块中的 Dispose 方法不具有任何功能,但可以在这里根据需要实现释放逻辑。

  6. 在**“生成”菜单中,单击“生成网站”**以确保模块中没有错误。

作为本节的最后一项任务,您将创建 ASP.NET 和 HTML 页,以便可以在本演练的稍后部分测试该自定义模块。

创建 ASP.NET 和 HTML 测试页

  1. 将一个名为 ASPXpage.aspx 的新的单文件 ASP.NET 网页添加到应用程序的根文件夹中。

  2. 移除现有标记,并用下面的标记替换之:

    <%@ Page Language="VB" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>ASPX Module Test Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        <%= Response.Headers.Get("CustomHeader2").ToString() %>
        </div>
        </form>
    </body>
    </html>
    
    <%@ Page Language="C#" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>ASPX Module Test Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        <%= Response.Headers.Get("CustomHeader2").ToString() %>
        </div>
        </form>
    </body>
    </html>
    
  3. 将一个名为 HTMLPage.htm 的新 HTML 页添加到 Web 应用程序的根文件夹中。

  4. 将下面的标记添加到该 HTML 页中。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
        <title>HTML Module Test Page</title>
    </head>
    <body>
        <div>
           HTML page.
           <br />
        </div>
    </body>
    </html>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
        <title>HTML Module Test Page</title>
    </head>
    <body>
        <div>
           HTML page.
           <br />
        </div>
    </body>
    </html>
    
  5. 保存所有更改。

  6. 分别运行 ASPXpage.aspx 页和 HTMLpage.htm 页,以确保可以在浏览器中查看它们。

    Bb763174.alert_note(zh-cn,VS.90).gif说明:

    使 Visual Studio 应用程序保持打开。您将返回到此应用程序以验证使用 IIS 管理器进行的配置更改。

此时,这些页能够运行,但它们没有调用自定义模块。在下一个过程中,您需要将自定义模块添加到请求管道中。

使用 IIS 管理器进行配置更改

在本节中,您将使用 IIS 管理器为 IIS 应用程序生成几个配置设置。您将注册自定义模块,添加自定义标头,然后关闭静态压缩。

注册自定义托管代码模块

  1. 在**“开始”菜单上,依次单击“所有程序”“附件”“运行”**。

  2. 在**“打开”框中,键入 inetmgr,然后单击“确定”**。

    Bb763174.alert_note(zh-cn,VS.90).gif说明:

    如果启用了用户帐户控制 (UAC),则当您试图访问 IIS 管理器时,它可能会显示一个消息。如果是这样,请单击“继续”。有关更多信息,请参见 User Account Control(用户帐户控制)。

  3. 在**“连接”**窗格中,展开计算机或承载该网站的服务器的名称。

  4. 展开**“站点”**文件夹。

  5. 选择网站“WalkthroughIIS7”。在 Windows Server 2008 中,如果该 Web 应用程序是网站的应用程序,则需要首先展开该网站,然后选择“WalkthroughIIS7”。

    默认情况下,IIS 管理器的中心窗格按区域显示 Web 服务器配置选项。对于“WalkthroughIIS7”Web 应用程序,存在两个区域:“ASP.NET”“IIS”

  6. 在中心窗格的**“IIS”部分中,双击“模块”**图标。

    中心窗格中的**“模块”**详细信息显示了当前为 IIS 配置的所有模块。

  7. 在**“操作”窗格中,单击“添加托管模块”**。

    此时将显示**“添加托管模块”**对话框。

  8. 在**“名称”**框中键入“CustomModule”。

    名称可以是描述该模块的任何字词。在本演练中,您将直接使用模块名称。

  9. 在**“类型”**列表中,选择或键入模块的托管类型的完全限定名。

    “CustomModule”类型出现在该列表中,因为 IIS 配置包括了 App_Code 文件夹中任何实现 IHttpModule 的类。

  10. 确保**“仅为对 ASP.NET 应用程序或托管处理程序的请求调用”[Invoke only for request to ASP.NET applications or managed handlers]**复选框未选中。

    对于本演练,您希望将该模块应用于管道中的所有请求,而不仅仅是 ASP.NET 请求。

  11. 单击**“确定”**。

    该托管代码模块即被添加到模块列表中。可能必须滚动列表或将列表重新排序才能看到添加的模块。

添加自定义响应头

  1. 在 IIS 管理器的左窗格中,单击“WalkthroughIIS7”节点的名称以显示站点的主配置窗格。

  2. 在中心窗格的**“IIS”设置部分中,双击“HTTP 响应头”[HTTP Response Headers]**图标。

    **“HTTP 响应头”**功能详细信息将显示在中心窗格中。该窗格显示了当前定义的所有 HTTP 响应头。

  3. 在**“操作”窗格中,单击“添加”**。

    将显示**“添加自定义 HTTP 响应头”**对话框。

  4. 在**“名称”**文本框中,输入“CustomHeader1”。

    名称可以是描述该标头的任何字词。

  5. 在**“值”**文本框中,键入值“SampleHeader”。

现在您将关闭静态压缩。这可以防止静态内容(如 HTML 页)被压缩。

关闭静态压缩

  1. 在左窗格中,单击“WalkthroughIIS7”节点的名称以便在中心窗格中查看该站点的主配置窗格。

  2. 在 IIS 管理器的中心窗格中,双击**“IIS”设置部分中的“压缩”**图标。

    **“压缩”**功能详细信息将显示在中心窗格中。

  3. 确保**“启用静态内容压缩”**复选框已清除。

在 Visual Studio 中验证配置更改

在本演练中,您已经使用 IIS 管理器执行了配置任务。在此过程中,您将查看应用程序的 Web.config 文件中的更改。

在 Web.config 文件中检查模块注册

  1. 返回到 Visual Studio 应用程序和“WalkthroughIIS7”应用程序。

  2. 在**“解决方案资源管理器”中,右击网站名称,再单击“刷新文件夹”**。

    这将使网站文件夹的 Visual Studio 视图与磁盘上的文件夹和文件同步。

    如果该应用程序原来不包含 Web.config 文件,那么该 Web 应用程序现在将包含一个 Web.config 文件。如果该应用程序原来已经包含一个 Web.config 文件,那么更改发生在该文件中。

  3. 在**“解决方案资源管理器”**中,双击 Web.config 文件以查看其内容。

    system.webServer 节包含您使用 IIS 管理器进行的配置更改。system.webServer 节具有以下子元素:

    • 一个 modules 元素,它为请求处理管道注册自定义模块。

    • 一个 httpProtocol 元素,它定义了自定义响应头。

    • 一个 urlCompression 元素,它禁用了静态压缩。

    system.webServer 节类似于下面的示例:

    <system.webServer>
      <modules>
        <add name="CustomModule" type="CustomModule" preCondition="" />
      </modules>
      <httpProtocol>
        <customHeaders>
          <add name="CustomHeader1" value="SampleHeader" />
        </customHeaders>
      </httpProtocol>
      <urlCompression doStaticCompression="false" />
    </system.webServer>
    

    有关 system.webServer 节的更多信息,请参见使用 ASP.NET 配置IIS 7.0: system.webServer Section Group (IIS Settings Schema)(IIS 7.0:system.webServer 节组(IIS 设置架构))。

测试自定义模块

IIS 7.0 具有集成请求管道。对所有应用程序资源(例如,.aspx 页或 .htm 页)的请求都可能在托管代码模块(例如,您已在本演练中创建的自定义模块)中引发管道通知。

Bb763174.alert_note(zh-cn,VS.90).gif说明:

在 IIS 管理器中配置托管代码模块时,您并未选择“仅为对 ASP.NET 应用程序或托管处理程序的请求调用”[Invoke only for request to ASP.NET applications or managed handlers]选项。如果您选择了此选项,则自定义模块只会接收有关 ASP.NET 资源的管道通知,而不会接收有关静态资源(例如,HTML 文件)的管道通知。

验证自定义模块应用于所有资源

  1. 在 Visual Studio 中,打开 ASPXpage.aspx 页,然后按 Ctrl+F5 在浏览器中查看该页。

    该模块中定义的自定义标头将显示在浏览器中。在 ASP.NET 页中,无法访问由 IIS 定义的自定义标头,因为此标头信息是在已经将页内容呈现到流之后添加的。但是,使用对 HTTP 通信进行监视的工具(例如,Fiddler)可以确认该标头已设置。

  2. 打开 HTTP 通信监视工具,并且在浏览器中刷新 ASPXpage.aspx 页。

    Bb763174.alert_note(zh-cn,VS.90).gif说明:

    如果 ASPXpage.aspx 页的 URL 使用 localhost,请将 localhost 更改为安装 IIS 7.0 的计算机的名称。在典型开发方案中,这也是运行 Visual Studio 的计算机。

  3. 验证“CustomHeader1”和“CustomHeader2”出现在响应的标头集合中。

  4. 在浏览器中查看 HTMLPage.htm。

  5. 验证“CustomHeader1”和“CustomHeader2”出现在响应的标头集合中。

后续步骤

本演练向您介绍了 IIS 7.0 中 ASP.NET 的配置。IIS 7.0 Web 服务器的配置设置和 ASP.NET 的配置设置被合并到一个配置文件中,您可以使用单个管理界面编辑该配置文件。

您还可能希望探索 IIS 管理器中的其他设置,以及所做更改如何反映在配置文件中。有关更多信息,请参见 Internet Information Services (IIS)(Internet 信息服务 (IIS))。

请参见

任务

演练:使用 MMC 在 IIS 6.0 中配置 ASP.NET 应用程序

概念

将 ASP.NET 应用程序从 IIS 6.0 迁移到 IIS 7.0

其他资源

Configuring Modules in IIS 7.0(在 IIS 7.0 中配置模块)

Configuring HTTP Response Headers in IIS 7.0(在 IIS 7.0 中配置 HTTP 响应头)