演练:在 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 调试代理)网站下载该工具。
说明: Fiddler 是一个 Microsoft 不支持的第三方工具。
创建自定义 HTTP 模块
首先,您需要创建一个新网站。
创建新的网站
在 Visual Studio 中,创建一个新的名为“WalkthroughIIS7”的本地 HTTP 网站。
有关如何创建本地 IIS 网站的信息,请参见演练:在 Visual Web Developer 中创建本地 IIS 网站。
在**“开始”菜单上,依次单击“所有程序”、“附件”和“运行”**。
在**“打开”框中,键入 inetmgr,然后单击“确定”**。
说明: 如果启用了用户帐户控制 (UAC),则当您试图访问 IIS 管理器时,它可能会显示一个消息。如果是这样,请单击“继续”。有关更多信息,请参见 User Account Control(用户帐户控制)。
验证该网站位于在集成模式下运行的应用程序池中。
有关如何设置 Web 应用程序模式的信息,请参见 Configure the Request-Processing Mode for an Application Pool(为应用程序池配置请求处理模式)。
您现在可以创建自定义 HTTP 模块了。
创建自定义 HTTP 模块
在 Visual Studio 的**“解决方案资源管理器”中,右击 Web 项目节点,再单击“添加新项”**。
显示**“添加新项”**对话框。
在**“Visual Studio 已安装的模板”下选择“类”**。
选择您想使用的编程语言。
输入“CustomModule”作为类名,然后单击**“添加”**。
如果网站尚未包含 App_Code 文件夹,此时将显示一个消息,询问您是否要将该类放在 App_Code 文件夹中。如果答案是肯定的,请单击**“是”**。
在类文件中,移除现有代码,并用下面的代码替换之:
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 方法不具有任何功能,但可以在这里根据需要实现释放逻辑。
在**“生成”菜单中,单击“生成网站”**以确保模块中没有错误。
作为本节的最后一项任务,您将创建 ASP.NET 和 HTML 页,以便可以在本演练的稍后部分测试该自定义模块。
创建 ASP.NET 和 HTML 测试页
将一个名为 ASPXpage.aspx 的新的单文件 ASP.NET 网页添加到应用程序的根文件夹中。
移除现有标记,并用下面的标记替换之:
<%@ 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>
将一个名为 HTMLPage.htm 的新 HTML 页添加到 Web 应用程序的根文件夹中。
将下面的标记添加到该 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>
保存所有更改。
分别运行 ASPXpage.aspx 页和 HTMLpage.htm 页,以确保可以在浏览器中查看它们。
说明: 使 Visual Studio 应用程序保持打开。您将返回到此应用程序以验证使用 IIS 管理器进行的配置更改。
此时,这些页能够运行,但它们没有调用自定义模块。在下一个过程中,您需要将自定义模块添加到请求管道中。
使用 IIS 管理器进行配置更改
在本节中,您将使用 IIS 管理器为 IIS 应用程序生成几个配置设置。您将注册自定义模块,添加自定义标头,然后关闭静态压缩。
注册自定义托管代码模块
在**“开始”菜单上,依次单击“所有程序”、“附件”和“运行”**。
在**“打开”框中,键入 inetmgr,然后单击“确定”**。
说明: 如果启用了用户帐户控制 (UAC),则当您试图访问 IIS 管理器时,它可能会显示一个消息。如果是这样,请单击“继续”。有关更多信息,请参见 User Account Control(用户帐户控制)。
在**“连接”**窗格中,展开计算机或承载该网站的服务器的名称。
展开**“站点”**文件夹。
选择网站“WalkthroughIIS7”。在 Windows Server 2008 中,如果该 Web 应用程序是网站的应用程序,则需要首先展开该网站,然后选择“WalkthroughIIS7”。
默认情况下,IIS 管理器的中心窗格按区域显示 Web 服务器配置选项。对于“WalkthroughIIS7”Web 应用程序,存在两个区域:“ASP.NET”和“IIS”。
在中心窗格的**“IIS”部分中,双击“模块”**图标。
中心窗格中的**“模块”**详细信息显示了当前为 IIS 配置的所有模块。
在**“操作”窗格中,单击“添加托管模块”**。
此时将显示**“添加托管模块”**对话框。
在**“名称”**框中键入“CustomModule”。
名称可以是描述该模块的任何字词。在本演练中,您将直接使用模块名称。
在**“类型”**列表中,选择或键入模块的托管类型的完全限定名。
“CustomModule”类型出现在该列表中,因为 IIS 配置包括了 App_Code 文件夹中任何实现 IHttpModule 的类。
确保**“仅为对 ASP.NET 应用程序或托管处理程序的请求调用”[Invoke only for request to ASP.NET applications or managed handlers]**复选框未选中。
对于本演练,您希望将该模块应用于管道中的所有请求,而不仅仅是 ASP.NET 请求。
单击**“确定”**。
该托管代码模块即被添加到模块列表中。可能必须滚动列表或将列表重新排序才能看到添加的模块。
添加自定义响应头
在 IIS 管理器的左窗格中,单击“WalkthroughIIS7”节点的名称以显示站点的主配置窗格。
在中心窗格的**“IIS”设置部分中,双击“HTTP 响应头”[HTTP Response Headers]**图标。
**“HTTP 响应头”**功能详细信息将显示在中心窗格中。该窗格显示了当前定义的所有 HTTP 响应头。
在**“操作”窗格中,单击“添加”**。
将显示**“添加自定义 HTTP 响应头”**对话框。
在**“名称”**文本框中,输入“CustomHeader1”。
名称可以是描述该标头的任何字词。
在**“值”**文本框中,键入值“SampleHeader”。
现在您将关闭静态压缩。这可以防止静态内容(如 HTML 页)被压缩。
关闭静态压缩
在左窗格中,单击“WalkthroughIIS7”节点的名称以便在中心窗格中查看该站点的主配置窗格。
在 IIS 管理器的中心窗格中,双击**“IIS”设置部分中的“压缩”**图标。
**“压缩”**功能详细信息将显示在中心窗格中。
确保**“启用静态内容压缩”**复选框已清除。
在 Visual Studio 中验证配置更改
在本演练中,您已经使用 IIS 管理器执行了配置任务。在此过程中,您将查看应用程序的 Web.config 文件中的更改。
在 Web.config 文件中检查模块注册
返回到 Visual Studio 应用程序和“WalkthroughIIS7”应用程序。
在**“解决方案资源管理器”中,右击网站名称,再单击“刷新文件夹”**。
这将使网站文件夹的 Visual Studio 视图与磁盘上的文件夹和文件同步。
如果该应用程序原来不包含 Web.config 文件,那么该 Web 应用程序现在将包含一个 Web.config 文件。如果该应用程序原来已经包含一个 Web.config 文件,那么更改发生在该文件中。
在**“解决方案资源管理器”**中,双击 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 页)的请求都可能在托管代码模块(例如,您已在本演练中创建的自定义模块)中引发管道通知。
说明: |
---|
在 IIS 管理器中配置托管代码模块时,您并未选择“仅为对 ASP.NET 应用程序或托管处理程序的请求调用”[Invoke only for request to ASP.NET applications or managed handlers]选项。如果您选择了此选项,则自定义模块只会接收有关 ASP.NET 资源的管道通知,而不会接收有关静态资源(例如,HTML 文件)的管道通知。 |
验证自定义模块应用于所有资源
在 Visual Studio 中,打开 ASPXpage.aspx 页,然后按 Ctrl+F5 在浏览器中查看该页。
该模块中定义的自定义标头将显示在浏览器中。在 ASP.NET 页中,无法访问由 IIS 定义的自定义标头,因为此标头信息是在已经将页内容呈现到流之后添加的。但是,使用对 HTTP 通信进行监视的工具(例如,Fiddler)可以确认该标头已设置。
打开 HTTP 通信监视工具,并且在浏览器中刷新 ASPXpage.aspx 页。
说明: 如果 ASPXpage.aspx 页的 URL 使用 localhost,请将 localhost 更改为安装 IIS 7.0 的计算机的名称。在典型开发方案中,这也是运行 Visual Studio 的计算机。
验证“CustomHeader1”和“CustomHeader2”出现在响应的标头集合中。
在浏览器中查看 HTMLPage.htm。
验证“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 响应头)