“经典”和“集成”pipe道模式在IIS7中有什么区别?

我昨天晚上部署了一个ASP.NET MVC应用程序,发现部署IIS7设置为集成模式的工作量较less。 我的问题是什么区别? 什么是使用其中一个或另一个的含义?

经典模式(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中IISpipe道与ASP.NET请求pipe道紧密集成(即,完全相同)的新模式。 ASP.NET可以看到它想要的每个请求,并沿途处理事情。 ASP.NET不再被视为外部插件。 它完全混合并集成在IIS中。 在这种模式下,ASP.NET HttpModule几乎具有与ISAPIfilter相同的function,而ASP.NET HttpHandler可以具有与ISAPI扩展可能具有的几乎相同的function。 在这种模式下,ASP.NET基本上是IIS的一部分。

集成应用程序池模式

当应用程序池处于集成模式时,可以利用IIS和ASP.NET的集成请求处理体系结构。 当应用程序池中的工作进程收到请求时,请求会通过一个有序的事件列表。 每个事件都会调用必要的本地和托pipe模块来处理部分请求并生成响应。

在集成模式下运行应用程序池有几个好处。 首先将IIS和ASP.NET的请求处理模型集成到统一的stream程模型中。 此模型消除了以前在IIS和ASP.NET中重复的步骤,如身份validation。 此外,集成模式可以使所有内容types的托pipefunction可用。

经典应用程序池模式

当应用程序池处于经典模式时,IIS 7.0将以IIS 6.0工作进程隔离模式处理请求。 ASP.NET请求首先会经过IIS中的本机处理步骤,然后被路由到Aspnet_isapi.dll以处理托pipe运行时中的托pipe代码。 最后,请求通过IIS路由回来发送响应。

IIS和ASP.NET请求处理模型的这种分离会导致一些处理步骤(如身份validation和授权)的重复。 此外,托pipe代码function(例如表单身份validation)仅适用于ASP.NET应用程序或您已将脚本映射到aspnet_isapi.dll处理的所有请求的应用程序。

在将生产环境升级到IIS 7.0并将应用程序分配到集成模式下的应用程序池之前,请确保在集成模式下testing现有应用程序的兼容性。 如果应用程序无法在集成模式下工作,则应该只在Classic模式下将应用程序添加到应用程序池。 例如,您的应用程序可能依赖于从IIS传递到受pipe运行时的身份validation令牌,并且由于IIS 7.0中的新架构,该进程会中断您的应用程序。

在IIS7中,DefaultAppPool和Classic .NET AppPool有什么区别?

原始来源: IIS体系结构简介

IIS 6.0和以前的版本:

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

这有效地暴露了两个单独的服务器(请求/响应)pipe道,一个用于本机ISAPIfilter和扩展组件,另一个用于托pipe应用程序组件。 ASP.NET组件将完全在ASP.NET ISAPI扩展泡泡内执行,并且仅在IIS脚本映射configuration中映射到ASP.NET的请求中执行。

对非ASP.NET内容types的请求: – 图像,文本文件,HTML页面和无脚本ASP页面由IIS或其他ISAPI扩展进行处理,并且对ASP.NET不可见。

这种模式的主要限制是ASP.NET模块和自定义ASP.NET应用程序代码提供的服务不适用于非ASP.NET请求

什么是脚本地图?

脚本映射用于将文件扩展名与在请求文件types时执行的ISAPI处理程序相关联。 脚本映射还具有一个可选设置,用于在允许处理请求之前validation与请求关联的物理文件是否存在

seen here可以seen here一个很好的例子

IIS 7及以上版本

IIS 7.0及更高版本从头开始重新devise,以提供全新的基于C ++ API的ISAPI。

IIS 7.0及以上版本将ASP.NET运行时与Web服务器的核心function集成在一起,提供了一个统一的(单个)请求处理pipe道,该pipe道暴露于本地和受pipe组件(IHttpModules)

这意味着IIS 7处理任何内容types的请求, NON ASP.NET Modules / native IIS modulesASP.NET modules在所有阶段提供请求处理。 这就是为什么NON ASP.NET内容types( .html,静态文件)可以由.NET模块处理。

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

在经典模式下,IIS直接处理h ISAPI扩展和ISAPIfilter。 并使用两条pipe道,一个用于本地代码,另一个用于托pipe代码。 您可以简单地说,在经典模式下,IIS 7.x可以像IIS 6一样工作,并且不会从IIS 7.xfunction中获得额外的好处。

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

经典模式通常,将Web应用程序从IIS 6.0移动到IIS 7.0经典模式只需要将应用程序放在以经典模式运行的应用程序池中。 例如,当您安装IIS 7.0时,默认情况下将Web服务器configuration为以集成模式运行。 它也被configuration为在默认应用程序池(称为DefaultAppPool)下运行。 要以经典模式运行Web应用程序,请使用Classic.NETAppPool应用程序或创build一个新的应用程序池,该应用程序池configuration为在经典模式下运行。 有关如何创build应用程序池的信息,请参阅创build应用程序池。 在经典模式下运行的应用程序中实现IHttpModule接口的任何自定义模块只会通知由ASP.NET运行时处理的pipe道请求。 例如,他们会收到有关.aspx页面请求的通知。 经典模式的应用程序生命周期与IIS 6.0中ASP.NET的生命周期相同。 有关更多信息,请参阅IIS 5.0和6.0的ASP.NET应用程序生命周期概述。 如果以经典模式运行的应用程序包含需要脚本映射来处理IIS中的自定义扩展的处理程序,则必须在httpHandler组和处理程序组中都注册该处理程序。 通过在处理程序元素中指定模块和scriptProcessor属性,将自定义文件扩展名映射到ASP.NET ISAPI扩展(Aspnet_isapi.dll)。 这些属性指定定义处理程序的模块是ISAPI扩展,并指定该扩展的path。 这是经典模式下的IIS 7.0如何提供与早期版本的IIS的向后兼容性。 但是,如果以集成模式运行应用程序,则必须删除模块和scriptProcessor属性。 有关更多信息,请参阅如何在IIS中configurationHTTP处理程序扩展。 将Web应用程序从IIS 6.0移到经典模式时,不保证在不更改的情况下以集成模式工作。 如果将应用程序从经典模式切换到集成模式(并更改任何自定义模块和处理程序),则可能需要对应用程序进行其他更改才能在集成模式下正常运行。 本主题的下一部分将介绍如何将应用程序移至IIS 7.0集成模式。

集成模式不包含自定义模块或处理程序的Web应用程序通常可以在IIS 7.0中的集成模式下无需更改。 依赖于自定义模块或处理程序的Web应用程序需要执行以下步骤以使应用程序能够以集成模式运行:使用“迁移”中描述的方法之一在Web.config文件的system.webServer部分中注册自定义模块和处理程序本主题后面的Webconfiguration文件集成模式部分。 定义HttpApplication请求pipe道事件(如BeginRequest和EndRequest)的事件处理程序仅在自定义模块的Init方法中。 确保解决了将ASP.NET应用程序升级到IIS 7.0的“集成模式和经典模式之间的已知区别”一节中讨论的任何问题:IIS 7.0集成模式和经典模式之间的差异。 实现IHttpModule接口的模块被称为托pipe代码模块,因为它们是使用.NET Framework构build的。 托pipe代码模块可以在服务器级别或在应用程序级别进行注册。 原生代码模块是仅在服务器级别注册的DLL(非托pipe代码)。 核心ASP.NETfunction(如会话状态和表单身份validation)在集成模式下作为托pipe模块实现。 将应用程序从经典模式移动到集成模式时,可以为经典模式保留自定义模块和处理程序注册,也可以将其删除。 如果不删除经典模式中使用的httpModules和httpHandlers注册,则必须将validation元素的validateIntegratedModeConfiguration属性设置为false以避免错误。 validation元素是system.webServer元素的子元素。 有关详细信息,请参阅ASP.NET与IIS 7.0集成中的“禁用迁移消息”一节。