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

https://www.jb51.net/article/26311.htm

IIS7的一些问题.
关注脚本之家微信公众号(jb51net) 每周都有大礼相送哦
而 IIS 7 完全整合 .NET 之后,架构的处理顺序有了很大的不同(如下图),最主要的原因就是 ASP.NET 从 IIS 插件(ISAPI extension)的角色,进入了 IIS 核心,而且也能以 ASP.NET 模块负责处理 IIS 7 的诸多类型要求。
 

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 的改进。

[转帖]IIS7 应用程序池的 托管管道模式与集成模式小结的更多相关文章

  1. ASP.NET 获取IIS应用程序池的托管管道模式

    asp.net 中怎样较为简单的获取网站程序池的托管管道模式 目前已知的方式是根据这个帖子https://github.com/kakalotte/... ,利用DirectoryEntry,但是程序 ...

  2. IIS7应用程序池集成和经典的区别 对IIS7经典模式和集成模式的理解 程序池经典和集成的区别

    IIS7应用程序池集成和经典的区别   IIS7应用程序池集成和经典的区别 IIS7应用程序池有集成和经典两种模式,根据微软官方的介绍, 集成模式,如果托管应用程序在采用集成模式的应用程序池中运行,服 ...

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

    IIS 7.0 支持两种管道模式:一种是IIS 7.0最新提供的集成管道模式,另一种是经典管道模式,经典管道模式是由先前版本的IIS提供的. 我们可以通过应用程序池设置管道模式,这项功能对IIS管理员 ...

  4. iis7.5 应用程序池 经典模式和集成模式的区别

    在 IIS 7.5 中,应用程序池有两种运行模式:集成模式和经典模式. 应用程序池模式会影响服务器处理托管代码请求的方式. 如果托管应用程序在采用集成模式的应用程序池中运行,服务器将使用 IIS 和 ...

  5. IIS经典模式和集成模式在管道模型中的不同

    问题: 有时候我们配置IIS后可能运行提示以下错误: HTTP 错误 500.23 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设置. 其中由 ...

  6. 对IIS7经典模式和集成模式的理解(转载)

    从IIS6新增应用程序池的概念,到现在IIS7,对HTTP请求处理功能已经越来越精确化和不断改善,IIS7应用程序池新增了经典模式和集成模式可供选择,不管官方还是一些书籍或文章都有介绍,但多数过于官方 ...

  7. 微软URLRewriter.dll的url重写在目标框架.Net Framework2.0、4.0和应用程序池经典模式、集成模式下的配置

    大家参考几篇园子里面的这篇文章: 文章1:微软URLRewriter.dll的url重写的简单使用 (讲解了使用UrlReWriter.dll的下载.web.config如何在目标框架2.0应用程序池 ...

  8. [转帖] IIS经典模式和集成模式的区别

    在 IIS 7.0 中,应用程序池有两种运行模式:集成模式和经典模式. https://blog.csdn.net/hongwei_23/article/details/44300923 这里面添加一 ...

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

    IIS7.0中的Web应用程序有两种配置模式:经典模式和集成模式.两者区别大家可以参考下,根据实际情况选用. 经典模式是为了与之前的版本兼容,使用ISAPI扩展来调用ASP.NET运行库,原先运行于I ...

随机推荐

  1. git的安装教程

    团队开发的时候常要用到git来对代码进行管理,平时开发的时候也需要使用git来做一些事情,如给vue项目进行代码编译等等. 那下面我们开始 一.安装和配置环境 首先下载git安装包(去官网下载,htt ...

  2. Spark-PySpark sql各种内置函数

    _functions = { 'lit': 'Creates a :class:`Column` of literal value.', 'col': 'Returns a :class:`Colum ...

  3. POJ 3613 [ Cow Relays ] DP,矩阵乘法

    解题思路 首先考虑最暴力的做法.对于每一步,我们都可以枚举每一条边,然后更新每两点之间经过\(k\)条边的最短路径.但是这样复杂度无法接受,我们考虑优化. 由于点数较少(其实最多只有\(200\)个点 ...

  4. JavaWeb_(SSH论坛)_四、页面显示

    基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 帖子表与回复表 ...

  5. php的switch函数

    PHP Switch 语句 PHP If...Else PHP While 循环 switch 语句用于基于不同条件执行不同动作. Switch 语句 如果您希望有选择地执行若干代码块之一,请使用 S ...

  6. Golang Singleton

    package example import ( "fmt" "sync") var m *singletonvar once sync.Once func G ...

  7. 出现org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER, 且出现无法找到Maven的依赖的问题

    解决方案:Build Path -> Java Build Path ->Libraries ->Add Library ->Maven Managed Dependences ...

  8. jQuery file upload 服务端返回数据格式

    Using jQuery File Upload (UI version) with a custom server-side upload handler 正常的返回结果,即上传文件成功 Exten ...

  9. leetcode-easy-design-384 Shuffle an Array

    mycode class Solution(object): def __init__(self, nums): """ :type nums: List[int] &q ...

  10. ansible 剧本进阶 角色

    主要内容: playbook(剧本) roles 一.查看收集到的信息 ansible cache -m setup setup (需要了解的参数) ansible_all_ipv4_addresse ...