昨晚我正在部署一个 ASP.NET MVC 应用程序,发现将 IIS7 设置为集成模式进行部署的工作量较少。我的问题是有什么区别?使用其中一种有何影响?
4 回答
经典模式(IIS6 及以下的唯一模式)是 IIS 仅直接与 ISAPI 扩展和 ISAPI 过滤器一起使用的模式。实际上,在这种模式下,ASP.NET 只是一个 ISAPI 扩展(aspnet_isapi.dll)和一个 ISAPI 过滤器(aspnet_filter.dll)。IIS 只是将 ASP.NET 视为在 ISAPI 中实现的外部插件,并像黑盒子一样使用它(并且仅当它需要向 ASP.NET 发出请求时)。在这种模式下,ASP.NET 与 PHP 或其他 IIS 技术没有太大区别。
另一方面,集成模式是 IIS7 中的一种新模式,其中 IIS 管道与 ASP.NET 请求管道紧密集成(即完全相同)。ASP.NET 可以看到它想要处理的每个请求并在此过程中进行操作。ASP.NET 不再被视为外部插件。它完全混合并集成在 IIS 中。在这种模式下,ASP.NETHttpModule
基本上具有与 ISAPI 过滤器几乎一样的功能,并且 ASP.NETHttpHandler
可以具有与 ISAPI 扩展几乎相同的功能。在这种模式下,ASP.NET 基本上是 IIS 的一部分。
集成应用池模式
当应用程序池处于集成模式时,您可以利用 IIS 和 ASP.NET 的集成请求处理体系结构。当应用程序池中的工作进程接收到请求时,该请求会通过一个有序的事件列表。每个事件调用必要的本地和托管模块来处理请求的一部分并生成响应。
在集成模式下运行应用程序池有几个好处。首先将 IIS 和 ASP.NET 的请求处理模型集成到一个统一的进程模型中。此模型消除了以前在 IIS 和 ASP.NET 中重复的步骤,例如身份验证。此外,集成模式使托管功能可用于所有内容类型。
经典应用池模式
当应用程序池处于经典模式时,IIS 7.0 会像在 IIS 6.0 工作进程隔离模式中一样处理请求。ASP.NET 请求首先通过 IIS 中的本机处理步骤,然后被路由到 Aspnet_isapi.dll 以在托管运行时中处理托管代码。最后,请求通过 IIS 路由回以发送响应。
IIS 和 ASP.NET 请求处理模型的这种分离导致一些处理步骤的重复,例如身份验证和授权。此外,托管代码功能(例如表单身份验证)仅适用于 ASP.NET 应用程序或您已为其脚本映射所有请求以由 aspnet_isapi.dll 处理的应用程序。
在将生产环境升级到 IIS 7.0 并将应用程序分配到集成模式下的应用程序池之前,请务必在集成模式下测试现有应用程序的兼容性。如果应用程序无法在集成模式下工作,您应该只将应用程序添加到经典模式下的应用程序池中。例如,您的应用程序可能依赖于从 IIS 传递到托管运行时的身份验证令牌,并且由于 IIS 7.0 中的新体系结构,该过程会破坏您的应用程序。
摘自:IIS7 中的 DefaultAppPool 和 Classic .NET AppPool 有什么区别?
原文出处:IIS架构简介
IIS 6.0 和以前的版本:
ASP.NET 通过 ISAPI 扩展、C API(基于 C 编程语言的 API)与 IIS 集成,并公开了自己的应用程序和请求处理模型。
这有效地暴露了两个独立的服务器(请求/响应)管道,一个用于本地 ISAPI 过滤器和扩展组件,另一个用于托管应用程序组件。ASP.NET 组件将完全在 ASP.NET ISAPI 扩展气泡内执行,并且仅 适用于在 IIS 脚本映射配置中映射到 ASP.NET 的请求。
对非 ASP.NET 内容类型的请求:图像、文本文件、HTML 页面和无脚本 ASP 页面,由 IIS 或其他 ISAPI 扩展处理,对 ASP.NET 不可见。
此模型的主要限制是 ASP.NET 模块和自定义 ASP.NET 应用程序代码提供的服务不适用于非 ASP.NET 请求
什么是脚本映射?
脚本映射用于将文件扩展名与请求该文件类型时执行的 ISAPI 处理程序相关联。脚本映射还有一个可选设置,在允许处理请求之前验证与请求关联的物理文件是否存在
一个很好的例子可以是seen here
IIS 7 及更高版本
IIS 7.0 及更高版本已从头开始重新设计,以提供全新的基于 C++ API 的 ISAPI。
IIS 7.0 及更高版本将 ASP.NET 运行时与 Web 服务器的核心功能集成在一起,提供了一个统一的(单一)请求处理管道,该管道暴露给称为模块 (IHttpModules) 的本机和托管组件
这意味着 IIS 7 处理到达任何内容类型的请求,NON ASP.NET Modules / native IIS modules
并ASP.NET modules
在所有阶段提供请求处理 这就是非 ASP.NET 内容类型(.html、静态文件)可以由 .NET 模块处理的原因.
- 您可以构建能够执行所有应用程序内容的新托管模块 (
IHttpModule
),并为您的应用程序提供一组增强的请求处理服务。 - 添加新的托管处理程序 (
IHttpHandler
)
在经典模式下,IIS 直接工作 h ISAPI 扩展和 ISAPI 过滤器。并使用两条管道,一条用于本机代码,另一条用于托管代码。您可以简单地说,在经典模式下,IIS 7.x 的工作方式与 IIS 6 一样,并且您不会从 IIS 7.x 功能中获得额外的好处。
在集成模式下,IIS 和 ASP.Net 紧密耦合,而不是像经典模式那样仅依赖于 Asp.net 上的两个 DLL。