IIS7中“经典”和“集成”管道模式之间有什么区别?


490

昨晚我在部署ASP.NET MVC应用程序时,发现将IIS7设置为集成模式进行部署的工作量较小。我的问题是有什么区别?以及使用其中一种的含义是什么?


10
与传统模式进行部署相比,如何减少工作量?只是好奇
Peter Lillevold 09年

9
@Peter:无扩展名的URL需要在经典模式下手动进行映射。
Mehrdad Afshari

2
即使在MVC Global.asax中,注释也要阅读:有关启用IIS6或IIS7经典模式的说明,请访问go.microsoft.com/?LinkId=9394801。或者,您可以只打开集成模式并包括System.Web.Mvc程序集,而所有内容都将正常运行。
乔恩·埃里克森

Answers:


642

经典模式(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.NET HttpModule基本上具有与ISAPI筛选器HttpHandler相同的功能,并且ASP.NET 可以具有与ISAPI扩展几乎相同的功能。在这种模式下,ASP.NET基本上是IIS的一部分。


8
集成比经典慢?
Alex Nolasco'2

我不确定说asp.net是IIS的一部分是否正确。它们看起来像一个单独的(尽管集成了)产品。我可能是错的。
Andrew Savinykh

@MehrdadAfshari中的HttpModules方法/事件是否iis7比in中的功能更多iis6?你能详细说明一下吗?
罗伊·纳米尔

另外,在集成管道模式下,作为事件的处理程序的映射可能会在应用程序中被覆盖,因此公开了请求管道中的每个阶段。例如,可以为某些类型的路由定义嵌入式资源HttpHandler,然后通过路由处理程序将它们映射到您的自定义处理程序。

1
一个完美的答案应该至少参考Microsoft的一篇文章,例如iis.net/learn/application-frameworks/…
Lex Li

115

集成应用程序池模式

当应用程序池处于集成模式时,您可以利用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体系结构简介


28
最后一段中的关键句子:“如果应用程序无法在集成模式下运行,则只能将其添加到经典模式下的应用程序池中。”
DavidRR

6
@JsonStatham-原因之一是集成模式无法使用ASP.NET模拟(站点> YourSite> IIS>身份验证)。如果您有Intranet站点并且正在使用Windows身份验证,则这是一个重要的考虑因素。 链接
user3308241,2016年

11

IIS 6.0和早期版本:

ASP.NET通过ISAPI扩展,C API(基于C编程语言的API)与IIS集成,并公开了自己的应用程序和请求处理模型。

这有效地公开了两个单独的服务器(请求/响应)管道,一个用于本机ISAPI筛选器和扩展组件,另一个用于托管应用程序组件。ASP.NET分量将ASP.NET ISAPI扩展气泡内完全执行AND ONLY 在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 Server的核心功能集成在一起,提供了一个统一的(单个)请求处理管道,该管道暴露给称为模块(IHttpModules)的本机组件和托管组件。

这意味着IIS 7处理到达任何内容类型的请求,并同时处理所有阶段的内容NON ASP.NET Modules / native IIS modulesASP.NET modules提供请求处理。 这就是.NET模块可以处理NON ASP.NET内容类型(.html,静态文件)的原因。 。

  • 您可以构建IHttpModule能够对所有应用程序内容执行的新托管模块(),并为您的应用程序提供一组增强的请求处理服务。
  • 添加新的托管处理程序(IHttpHandler

5

在经典模式下,IIS可以直接使用ISAPI扩展和ISAPI筛选器。并且使用两条管道,一条用于本机代码,另一条用于托管代码。您可以简单地说,在IIS 7的经典模式下,IIS 7.x的工作原理与IIS 6相同,并且您没有从IIS 7.x的功能中获得额外的好处。

在集成模式下,IIS和ASP.Net紧密耦合,而不是像传统模式下那样仅依赖于Asp.net上的两个DLL。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.