IIS7 应用程序池的 托管管道模式与集成模式小结

IIS 7 托管管道模式 经典模式(Classic) 集成模式(Integrated) 分析与理解

IIS 7.0 支持两种管道模式:一种是IIS 7.0最新提供的集成管道模式,另一种是经典管道模式,经典管道模式是由先前版本的IIS提供的。

我们可以通过应用程序池设置管道模式,这项功能对IIS管理员尤其有用,因为这样既可以令一台服务器仅运行一种模式,也可以令两种模式同时运行于一台服务器上。

上述两种管道模式使用的web.config文件存在重大的区别,许多在经典管道模式下能够正常工作的web.config文件都无法在集成管道模式下正常工作。利用AppCmd.exe,我们可以将经典管道模式下的配置文件格式自动转换为集成管道模式下的配置文件格式。

我们有必要首先看看各种模式的结构,并且研究两种模式之间的区别。

1. 经典模式

在IIS 6.0中的经典模式中,ASP.NET是一个添加到IIS中的ISAPI。IIS 7.0之所以支持这种模式,是为了做到向后兼容。但是,经典模式缺少许多集成模式才能提供的特性。在经典模式中,IIS拥有自身的管道,这些管道可以通过创建一个ISAPI扩展进行扩充,而ISAPI扩展是以难以开发而著称的。ASP.NET作为一个ISAPI扩展运行,只是IIS管道中的一项组成部分。

下图很好地解释了上述情况。注意,在这种情况下,ASP.NET似乎是一种类似于马后炮的成果,仅当IIS处理ISAPI扩展时才能够发挥作用。

利用文件扩展名,可以判断使用哪个ISAPI处理程序。例如,可以将扩展名为.aspx 和.ascx的文件映射到aspnet_isapi.dll;并且将扩展名为.asp的文件映射到asp.dll,这样就可以处理传统的ASP页面;此外,将扩展名为.php的文件映射到php.dll,这样就可以处理PHP页面,前提是已经安装了php.dll。

此外,在IIS 6.0和IIS 7.0的经典模式中,某些特性是重复的。例如,错误处理就是一种重复的特性,因为IIS可以处理非ASP.NET页面,而ASP.NET可以处理所有将处理程序映射为aspnet_isapi.dll的页面。

在IIS 6.0中,我们可以将所有文件类型都映射到ASP.NET,但是这样做存在一些限制。最大的限制就是如何处理默认文档:一个默认文档仅当在global.asax中或者在一个HTTP模块中被指定为默认文档时,这个默认文档才能够得到处理。某些自定义的配置需要使用aspnet_isapi.dll处理所有的文件类型。IIS 7.0可以轻易地解决这个问题。

经典模式可以在无须修改web.config的前提下运行现有的Web网站,因此,如果使用的Web farm中既包括IIS 6.0服务器,也包括IIS 7.0服务器,或者因为某些原因无法将web.config文件转换为遵循新语法的web.config文件,那么就可以使用经典模式。

2. 集成模式

利用集成模式,可以将ASP.NET作为IIS的有机组成部分。现在,IIS服务器的功能被划分为40多个模块,因此也就将IIS和ASP.NET的功能划分为不同的组成部分。诸如StaticFileModule、BasicAuthenticationModule、FormsAuthentication、Session、Profile,以及RoleManager等模块都是IIS管道的组成部分。注意,FormsAuthentication、Session、Profile,以及RoleManager原本就是ASP.NET的组成部分,与IIS并无关系。

下图使用模块解释了IIS管道。这些模块原本是ASP.NET的组成部分,现在已经是IIS管道的有机组成部分。
IIS管道提供了二十多种事件,开发人员可以利用这些事件来扩展Web服务器的功能。实际上,通过创建定制模块,同时更新applicationHost.config,可以仅使用自定义模块,而无须再使用微软公司提供的内置模块,我们可以将IIS 7.0中的模块替换为自定义的模块。

3. 两种模式之间配置的区别

其实,总的来说最大的差别就是经典模式处理ASP.NET程序时,需要退出管道,然后把程序转入ASP.NET ISAPI过滤器,通过ISAPI的处理,在将一个HTTP响应返回给客户端之前,这个请求再返回管道。而集成模式把ASP.NET已经集成到管道中,是处理无论ASP.NET程序还是非ASP.NET程序都在管道中进行,不考虑程序类型。简化了工作。

补充

IIS 7.0对配置文件进行了一些修改,Web开发人员可以使用这些修改内容。例如,<system.webServer>节就是这样一项修改,无论是经典模式还是集成模式都可以识别<system.webServer>节,同时,<system.webServer>节既可以在applicationHost.config文件中设置,也可以在web.config文件中设置。<system.webServer>节既可以控制静态页面,也可以控制动态页面。即使在经典模式中,<system.webServer>节也具有重要作用,它可以帮助Web开发人员在web.config文件中设置不同的IIS配置。

在集成模式中,HTTP模块和HTTP处理程序不再定义于<system.web>中,而是定义于<system.webServer>中。如果在集成模式中运行一个包括了HTTP模块或HTTP处理程序的web.config文件,那么将会发生失效。幸运的是,微软公司已经详细规定了一个编号为500.22的错误信息,这个错误信息说明了如何一步步地迁移web.config文件。

IIS 7.5 中配置 <system.webServer> 节点

问题

在 IIS7.5 中配置 <customError><error> 节点的404页面不起作用

分析

<system.web>节点是iis7.0之前版本的主要配置节点,在II7.0以后IIS管道处理与ASP.NET管道处理进行了集成,提高了ASP.NET的处理性能。由于程序运行在IIS7.5集成模式下,需要在<system.webServer>节点中配置,新增加的<system.webServer>节点中需要进行哪些修改以程序在IIS7的集成模式下能完全生效呢,主要包含以下几个方面:

(1) <modules> ----- 相当于<system.web>中的<httpModules>

(2) <handlers> ----- 相当于<system.web>中的<httpHandlers>

(3) <customError>下的<error> ----- 相当于<system.web>中的<httpErrors>

以上三点中,如果你的程序中有自定义的httpModules或者httpHandlers的话,那么第一点和第二点非常重要,具体资料请MSDN。

配置

<httpErrors errorMode="DetailedLocalOnly">
<remove statusCode="404" />
<error statusCode="404" path="/404.htm" responseMode="ExecuteURL" />
</httpErrors>

补充

errorMode有三个值,分别为Custom、DetailedLocalOnly、Detailed,意思为对用户与服务器端始终显示自定义页面、只能服务器端显示详细出错信息、对用户与服务器端始终显示详细出错信息。

responseMode有File、ExecuteUrl、Redirect三个层,分别表示使用服务器端静态文件、可执行的URL、URL转向。

注意:<httpErrors>与<customErrors>是不同的,前者主要用于处理http相关的错误信息,而后者主要是处理应用程序级的错误页转向。

<customErrors>

同样,如果Application_Error和<customerErrors>同时存在,也存在执行顺序的问题。因为优先级Application_Error事件> <customErrors>配置项,所以发生应用程序级错误时,优先执行Application_Error事件中的代码,如果Application_Error事件中调用了Server.ClearError()函数,<customerErrors>配置节中的defaultRedirect不起作用,因为Exception已经被清除;如果Application_Error事件中没用调用了Server.ClearError()函数,错误页会重新定位到defaultRedict指定的URL页面,为用户显示友好出错信息。

通过对.NET提供的以上四种错误处理机制的分析,我们可以把它们从不同的角度分类,便于我们理解和使用。

1、从功能上分类:用于异常处理(Handling exceptions)是Page_Error事件和Application_Error事件;用户错误页面重定向(Redirecting the user to an error page)的是 ErrorPage属性 和 <customErrors>配置项。

2、从错误处理的范围分类:用于页面级(Page level)错误处理的是Page_Error事件 和 ErrorPage属性;用于应用程序级(Application level)错误处理的是Application_Error事件 和 <customErrors>配置项。

这些 ASP.NET 模块不只能处理 ASP.NET 网页程序,也能处理其他如 ASP 程序、PHP 程序或静态 HTML 网页,也因为 ASP.NET 的诸多功能已经成为 IIS 7 的一部份,因此 ASP 程序、PHP 程序或静态 HTML 网页等类型的要求,也能使用像是Forms认证(Forms Authentication)或输出缓存(Output Cache)等 ASP.NET 2.0 的功能(但须修改 IIS 7 的设定值)。也因为 IIS 7 允许自行以 ASP.NET API 开发并加入模块,因此 ASP.NET 网页开发人员将更容易扩充 IIS 7 和网站应用程序的功能,甚至能自行以 .NET 编写管理 IIS 7 的程序(例如以程控 IIS 7 以建置网站或虚拟目录)

IIS 7 的执行架构图(集成托管信道模式下的架构)
小结
IIS5 到 IIS6 的改进,主要是 HTTP.sys 的改进。
IIS6 到 IIS7 的改进,主要是 ISAPI 的改进。

(0)

相关推荐

  • IIS7.5应用程序池集成模式和经典模式的区别介绍

    在 IIS 7.5 中,应用程序池有两种运行模式:集成模式和经典模式. 应用程序池模式会影响服务器处理托管代码请求的方式. 如果托管应用程序在采用集成模式的应用程序池中运行,服务器将使用 IIS 和 ASP.NET 的集成请求处理管道来处理请求. 如果托管应用程序在采用经典模式的应用程序池中运行,服务器会继续通过 Aspnet_isapi.dll 路由托管代码请求,其处理请求的方式就像应用程序在 IIS 6.0 中运行一样. 经典模式: 指的是与IIS 6或者之前版本保持兼容的一种模式,一个典型

  • IIS7的应用程序池详细解析

    在IIS 7中,添加一个应用程序或者单独的网站,默认会自动新建一个对应的"应用程序池",这也是IIS 7的一大特色. 在早期的IIS 5.0中,只有一个应用程序池的情况下,很容易造成"全军覆没,一荣俱损".因为所有的网站(或者虚拟目录下的应用程序)都"寄居"在一个"池",当这个"池"崩溃了,所有的网站都杯具了. 后来的IIS 6中,有了"应用程序池"的概念,但是默认不会自动添加,IIS

  • IIS7 应用程序池的 托管管道模式与集成模式小结

    IIS 7 托管管道模式 经典模式(Classic) 集成模式(Integrated) 分析与理解 IIS 7.0 支持两种管道模式:一种是IIS 7.0最新提供的集成管道模式,另一种是经典管道模式,经典管道模式是由先前版本的IIS提供的. 我们可以通过应用程序池设置管道模式,这项功能对IIS管理员尤其有用,因为这样既可以令一台服务器仅运行一种模式,也可以令两种模式同时运行于一台服务器上. 上述两种管道模式使用的web.config文件存在重大的区别,许多在经典管道模式下能够正常工作的web.c

  • IIS7 经典模式和集成模式的区别分析

    经典模式是为了与之前的版本兼容,使用ISAPI扩展来调用ASP.NET运行库,原先运行于IIS6.0下的Web应用程序迁移到IIS7.0中只要将应用程序配置成经典模式,代码基本不用修改就可以正常运行.集成模式是一种统一的哀求处理管道,它将ASP.NET请求管道与IIS核心管道组合在一起,这种模式能够提供更好的性能,能够实现配置和治理的模块化,而且增加了使用托管代码模块扩展IIS时的灵活性.假如老的Web应用程序运行于IIS7.0的集成模式下,可能需要对应用程序的web.config文件进行修改,

  • IIS7.5 检测到在集成的托管管道模式下不适用的 ASP.NET设置

    在调试一个网上下载的.net网站时,打开就提示出错: 错误摘要 HTTP 错误 500.22 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设置. 根据提示错误,应该是需要把应用程序池的托管管道模式从[集成]改为[经典], 打开IIS管理器,点击左上角的[应用程序池],在[应用程序池]里面找到该网站的应用程序池名称,双击打开基本设置,把托管管道模式改为[经典]. 这是网站使用独立应用程序池的更改方法,如果是共享一个默认的应用程序池,应该是修

  • VirtualBox的Linux虚拟机文本模式和图形模式的切换问题

    1.默认开机进入文本模式 如果想让开机自动进纯文本模式, 修改/etc/inittab 找到其中的 id:5:initdefault: 这行指示启动时的运行级是5,也就是图形模式 改成3就是文本模式了 id:3:initdefault: 这是因为Linux操作系统有六种不同的运行级(run level),在不同的运行级下,系统有着不同的状态,这六种运行级分别为: 0:停机(记住不要把initdefault 设置为0,因为这样会使Linux无法启动) 1:单用户模式,就像Win9X下的安全模式.

  • windows Powershell 快速编辑模式和标准模式

    powershell控制台有两种模式,一个是快速编辑模式,一个是标准模式. 快速编辑模式和标准模式的切换可以通过控制台标题栏->鼠标右击->属性->选项->编辑选项 . Powershell标准模式 鼠标右击选择标记后才能实现复制和粘切功能. Powershell快速编辑模式 可以通过鼠标右键选择任意矩形区域内的文本,并且鼠标右击实现复制功能.

  • JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)

    什么是面向对象?面向对象是一种思想!(废话). 面向对象可以把程序中的关键模块都视为对象,而模块拥有属性及方法.这样我们如果把一些属性及方法封装起来,日后使用将非常方便,也可以避免繁琐重复的工作.接下来将为大家讲解在JS中面向对象的实现.   工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,而由于在ECMAScript中无法创建类,因此用函数封装以特定接口创建对象.其实现方法非常简单,也就是在函数内创建一个对象,给对象赋予属性及方法再将对象返回即可. function createBlo

  • js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)

    在上篇文章给大家介绍了javascript面向对象基础,本篇文章继续深入学习javascript面向对象,JS的语法非常灵活,简单的对象创建就有好几种不同的方法.这些过于灵活的地方有时候确实很让人迷惑,那么今天我们就来梳理一下JS中常用的创建对象的几种方法吧. 前言 虽然使用 Object构造函数 或者使用 对象字面量 可以很方便的用来创建一个对象,但这种方式有一个明显的缺点:使用一个接口创建多个对象会产生很多冗余的代码.因此为了解决这个问题,人们开始使用以下几种方式来常见对象. 工厂模式 该模

  • JavaScript设计模式之工厂模式和构造器模式

    什么是模式 前阵子准备期末考试,劳神又伤身的,实在闲不得空来更新文章,今天和大家说说javascript中的设计模式. 首先呢,我们需要知道的是:模式是一种可复用的解决方案,而反模式呢就是针对某个问题的不良解决方案. js反模式常见例子 1.向setTimeout和setInterval传递字符串,而不是函数,这会触发eval()的内部使用. 2.在全局上下文中定义大量的变量污染全局命名空间 3.修改Object类的原型 4.以内联形式使用js,嵌入在HTML文件中的js代码是无法包含在外部单元

  • 正则表达式的多行模式与单行模式图文分析

    在Expresso中,测试"多行模式" 测试一 注意:这里样例文本中3eeeee后面没有回车,光标就在e的后面.匹配的结果是3eeeee,如上图的Search Results区中所示. 为什么这里不能匹配1abcde和2abc? 开启多行模式 ^ 可以匹配字符串开头(字符串的开始位置),也可以匹配行的开头(即换行符\n之后的位置) $ 可以匹配字符串结尾(字符串的结束位置), 也可以匹配行的结尾(即换行符\n之前的位置) 关闭多行模式 ^ 只能匹配字符串开头 $ 只能匹配字符串结尾 知

随机推荐