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

更新:2007 年 11 月

本主题介绍如何将 Web 应用程序从 Internet 信息服务 (IIS) 6.0 迁移到 IIS 7.0。可以将 IIS 7.0 中的 Web 应用程序配置为使用经典模式或集成模式。经典模式使用 ISAPI 扩展来调用 ASP.NET 运行库,以此保持对 IIS 早期版本的向后兼容性。此选项通常只需对现有应用程序进行少量修改,甚至完全不需要修改。

IIS 7.0 集成模式是一种统一的请求处理管道,它将 ASP.NET 请求管道与 IIS 核心请求管道组合在一起。集成管道提供更好的性能,实现配置和管理的模块化,且增加了使用托管代码模块扩展 IIS 时的灵活性。例如,您可以在 Web 应用程序的 App_Code 文件夹中定义一个托管代码模块,然后注册该模块,将其应用于所有 IIS 请求(包括对静态文件的请求)。

使用 IIS 7.0 集成模式可能需要对应用程序的 Web.config 文件稍加更改。如果应用程序使用了任何实现 IHttpModule 接口的自定义模块,则还可能需要进行其他一些更改。

有关 IIS 7.0 集成模式下的请求处理管道的概述,请参见 IIS 7.0 的 ASP.NET 应用程序生命周期概述。使用 IIS 7.0 时,可以在同一个服务器上以经典模式和集成模式并行运行应用程序。经典模式和集成模式都支持 .NET Framework 2.0 版和更高版本。.NET Framework 1.1 版仅在经典模式下受支持。有关如何从早期版本的 IIS 升级到 IIS 7.0 的更多信息,请参见 Upgrading ASP.NET Applications to IIS 7.0: Differences between IIS 7.0 Integrated Mode and Classic mode(将 ASP.NET 应用程序升级到 IIS 7.0:IIS 7.0 集成模式和经典模式之间的区别)。

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

您可以使用本主题中的信息将 Web 应用程序从 IIS 5.x 迁移到 IIS 7.0。但是,您可能需要进行其他一些更改,在此不展开讨论。有关更多信息,请参见。

本主题包含以下部分:

  • IIS 7.0 中的 Web.config 文件

  • 将 Web 应用程序迁移到经典模式

  • 将 Web 应用程序迁移到集成模式

IIS 7.0 中的 Web.config 文件

在将 ASP.NET Web 应用程序迁移到 IIS 7.0 集成模式时,必须更新 Web.config 文件。IIS 7.0 在管理 Web.config 文件的方式以及 Web.config 文件中可以存储的设置类型方面有所变化。新设置位于名为 system.webServer 的新配置节中。

在 IIS 6.0 中,ASP.NET MMC 管理单元提供了用于配置 ASP.NET 的 IIS 相关管理功能。有关更多信息,请参见演练:使用 MMC 在 IIS 6.0 中配置 ASP.NET 应用程序

在 IIS 7.0 中,ASP.NET 应用程序的管理与 IIS 管理更加紧密地集成在一起,因此不存在单独的管理单元。相反,所有 IIS 和 ASP.NET 配置都是使用 IIS 管理器 完成的。因为 IIS 7.0 配置信息基于 .NET Framework 配置系统,所以在 IIS 7.0 中运行的应用程序的 Web.config 文件同时包含 Web 服务器和 ASP.NET 配置设置。例如,对于在 IIS 7.0 中运行的 ASP.NET 应用程序,可以在其 Web.config 文件中指定要在浏览器未请求特定文件时返回的默认文件。(在 IIS 6.0 和早期版本的 IIS 中,此设置在 IIS 元数据库中维护。)

编辑 Web.config 文件

通过以下方式,可以更改在 IIS 7.0 中运行的 Web 应用程序的 Web.config 文件:

  • 使用 Visual Studio 或 Visual Web Developer 或者使用文本编辑器程序直接编辑 Web.config 文件。

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

  • 使用 ASP.NET 网站管理工具。有关更多信息,请参见 ASP.NET 网站管理工具

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

    在该网站管理工具中进行的更改不会影响 system.webServer 元素中的子配置元素。

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

system.webServer 节

Web.config 文件中的 system.webServer 配置节指定了应用于 Web 应用程序的 IIS 7.0 设置。system.WebServer 节是 configuration 元素的子元素。有关更多信息,请参见 IIS 7.0: system.webServer Section Group (IIS Settings Schema)(IIS 7.0:system.webServer 节组(IIS 设置架构))。

在 system.WebServer 配置组中可以设置的 Web 服务器设置的示例包括:

  • 当请求未包含特定资源时,Web 服务器返回给客户端的默认文档(defaultDocument 元素)。

  • 响应的压缩设置(httpCompression 元素)。

  • 自定义标头(httpProtocol 节的 customHeaders 元素)。

  • 模块(modules 元素)。

  • 处理程序(handlers 元素)。

一些设置仅适用于 IIS 7.0 集成模式,而不适用于经典模式。例如,如果应用程序在经典模式下运行,则将忽略 Web.config 文件的 system.WebServer 节中指定的所有托管代码模块和处理程序。必须与早期版本的 IIS 中一样,使用 system.web 节的 httpModuleshttpHandlers 元素来定义托管代码模块和处理程序。

有关使用 system.webServer 配置节的示例,请参见如何:为 IIS 7.0 配置 <system.webServer> 节

将 Web 应用程序迁移到经典模式

通常,将 Web 应用程序从 IIS 6.0 迁移到 IIS 7.0 经典模式只需要将该应用程序放入在经典模式下运行的应用程序池。例如,在随 一起安装 IIS 7.0 时,默认情况下将 Web 服务器配置为在集成模式下运行。此外还会将其配置为在默认应用程序池下运行,该应用程序池称为 DefaultAppPool。若要在经典模式下运行 Web 应用程序,请使用 Classic.NETAppPool 应用程序,或者创建一个新的应用程序池并将其配置为在经典模式下运行。有关如何创建应用程序池的信息,请参见 Create an Application Pool(创建应用程序池)。

任何在以经典模式运行的应用程序中实现 IHttpModule 接口的自定义模块都只能得到有关 ASP.NET 运行库所处理的管道请求的通知。例如,它们会得到有关 .aspx 页面请求的通知。经典模式的应用程序生命周期与 IIS 6.0 中 ASP.NET 的生命周期相同。有关更多信息,请参见 IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述

如果在经典模式下运行的应用程序包含需要使用脚本映射来处理 IIS 中的自定义扩展的处理程序,则必须在 httpHandler 组和 handler 组中都注册该处理程序。通过指定 handler 元素中的 modules 和 scriptProcessor 属性,可以将自定义文件扩展名映射到 ASP.NET ISAPI 扩展 (Aspnet_isapi.dll)。这些属性指定定义该处理程序的模块是 ISAPI 扩展,同时还指定该扩展的路径。这正是经典模式下的 IIS 7.0 提供与早期版本 IIS 的向后兼容性的方式。但是,如果在集成模式下运行应用程序,则必须移除 modules 和 scriptProcessor 属性。有关更多信息,请参见如何:在 IIS 中配置 HTTP 处理程序扩展名

在将 Web 应用程序从 IIS 6.0 迁移到经典模式时,不能保证它不做更改即可在集成模式下正常工作。如果将应用程序从经典模式切换到集成模式(并且更改所有自定义模块和处理程序),则可能必须进行其他一些更改,该应用程序才能在集成模式下正确运行。本主题的下一节将解释如何将应用程序迁移到 IIS 7.0 集成模式。

将 Web 应用程序迁移到集成模式

不包含自定义模块或处理程序的 Web 应用程序通常无需更改即可在 IIS 7.0 集成模式下正常工作。对于依赖于自定义模块或处理程序的 Web 应用程序,需要执行以下步骤来使其能够在集成模式下运行:

实现 IHttpModule 接口的模块被称为托管代码模块,因为它们是使用 .NET Framework 生成的。可以在服务器级别或应用程序级别注册托管代码模块。本机代码模块是仅在服务器级别注册的 DLL(非托管代码)。在集成模式下,将以托管模块的形式实现核心 ASP.NET 功能,例如会话状态和 Forms 身份验证。

在将应用程序从经典模式迁移到集成模式时,可以保留经典模式下的自定义模块和处理程序注册,也可以将这些注册移除。如果不移除经典模式下使用的 httpModuleshttpHandlers 注册,则必须将 validation 元素的 validateIntegratedModeConfiguration 属性设置为 false 以避免错误。validation 元素是 system.webServer 元素的子元素。有关更多信息,请参见 ASP.NET Integration with IIS 7.0(将 ASP.NET 与 IIS 7.0 集成)中的“Disabling the migration message”(禁用迁移消息)部分。

迁移 Web.config 文件以便在集成模式下使用

如果模块或处理程序是在应用程序级别定义的,则不会自动调用该模块或处理程序。这涉及符合以下条件的模块或处理程序:在 Bin 文件夹下的程序集中定义;在 App_Code 文件夹下作为源代码定义;没有在 Web.config 文件的 system.webServer 节中注册和定义。为了使模块或处理程序能够参与集成模式请求管道,必须使用下列方法之一注册该模块或处理程序:

用来使用集成模式的类和属性

在 IIS 7.0 集成模式以及 .NET Framework 3.0 版或更高版本中使用应用程序时,可以使用下面这些在经典模式下不可用的类和成员:

请参见

概念

在装有 IIS 7.0 和 Visual Studio 的 Windows Vista 上运行 Web 应用程序