IIS7.0 托管管道模式解析
2012年01月17日
IIS 改善和发展的主要因素是IIS已经成为应用程序(特别是ASP.NET)的支持平台。通过将ASP.NET直接集成到 IIS 7.0 中,IIS 7.0进一步推动了平台的发展。从管理功能到身份验证,乃至请求处理管道本身,相关功能都已经集成到IIS 7.0之中。
将管道集成到IIS 7.0中具有两个好处:一是为基于ASP.NET的Web应用程序及IIS 7.0扩展提供了更好的性能,二是通过使用托管代码获得了更好的控制能力。
IIS 7.0可以支持两种管道模式:一种是IIS 7.0最新提供的集成管道模式,另一种是经典管道模式,这种模式是由先前版本的IIS提供的。我们可以在应用程序池级设置管道模式,这项功能对IIS管理员尤其有用,因为这样既可以令一台服务器仅运行一种模式,也可以令两种模式同时运行于一台服务器上。
ASP.NET的性能之所以能够得到改善,是因为ASP.NET应用程序不再需要退出管道并加载ISAPI进程来处理ASP.NET代码,然后再返 回到管道为客户提供响应信息。为了保持应用程序的兼容性,IIS 7.0仍然支持经典管道模式,但是,现在应该尽可能地使用新的集成管道。
1. 经典模式
在IIS 6.0中,ASP.NET扮演了一个ISAPI过滤器的角色,也就是说,请求退出管道后,由aspnet.dll进行处理,然后返回到管道进行进一步处 理,最终将响应返回给客户端。在IIS 6.0中,一个客户端的HTTP请求将沿着管道移动,直到确定了一个处理程序,如果这个文件是一个ASP.NET文件,那么它就转入ASP.NET ISAPI过滤器,通过ISAPI的处理,在将一个HTTP响应返回给客户端之前,这个请求还将返回管道。IIS 7.0继续提供了这种模式,称为经典模式。
在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. 集成管道模式
利用IIS 7.0中的集成管道,开发人员可以将自己的托管代码在管道中集成为一个模块。在先前版本的IIS中,这需要开发ISAPI过滤器或应用程序,对多数开发人 员而言,这是一项难度很高的工作。在IIS 7.0中,可以用托管代码开发模块,并且模块可以作为请求管道的组成部分。利用IIS 7.0的集成管道模式,可以在管道中处理ASP.NET文件,这样可以在处理过程的任意一个步骤使用ASP.NET代码。因为ASP.NET已经集成到管 道中,所以,诸如身份验证之类的ASP.NET功能也可以用于处理非ASP.NET内容。每个请求都可以由IIS和ASP.NET进行处理,而不必考虑其 所属类型。
与ASP.NET集成也意味着可以使用ASP.NET身份验证对任何文件、文件夹,以及IIS 7.0的功能,从而有效地进行访问控制。在IIS 7.0出现之前,因为ASP.NET需要退出管道才能完成处理工作,所以任何不是由ASP.NET处理的文件,如HTML、Perl,甚至图形图像等内 容,都无法由ASP.NET进行处理,因此也不会由ASP.NET身份验证机制来进行访问控制。所以,就必须使用Windows集成的身份验证或自定义的 身份验证机制对不是由ASP.NET处理的文件进行访问控制。利用集成管道,可以大大简化身份验证方法的开发工作,可以将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. 两种模式之间配置的区别
IIS 7.0对配置文件进行了一些修改,Web开发人员可以使用这些修改内容。例如,节就是这样一项修改,无 论是经典模式还是集成模式都可以识别节,同时,节既 可以在applicationHost.config文件中设置,也可以在web.config文件中设 置。节既可以控制静态页面,也可以控制动态页面。即使在经典模式 中,节也具有重要作用,它可以帮助Web开发人员在web.config文件中设置不同的IIS配置。
在集成模式中,HTTP模块和HTTP处理程序不再定义于中,而是定义于中。如果在集成模式中运行一个包括了HTTP模块或HTTP处理程序的web.config文件,那 么将会发生失效。幸运的是,微软公司已经详细规定了一个编号为500.22的错误信息,这个错误信息说明了如何一步步地迁移web.config文件(参 见下图)。
注意,web.config文件中仍然保留了httpModules节,其目的在于向后兼容,但是,在system.webServer 中,modules节则处于优先的地位。validateIntegratedMode Configuration属性可以确保IIS不会因为存在遗留的节而产生问题。
集成管道模式是默认的管道模式,具有一些比较重要的优势。我们需要做的就是迁移定义了HTTP处理程序和HTTP模块的所有web.config文件,从而确保其能够在IIS 7.0下正常工作。
IIS 7.5 中配置 节点
问题
在 IIS7.5 中配置 节点的404页面不起作用
分析
节点是iis7.0之前版本的主要配置节点,在II7.0以后IIS管道处理与ASP.NET管道处理进行了 集成,提高了ASP.NET的处理性能。由于程序运行在IIS7.5集成模式下,需要在节点中配置,新 增加的节点中需要进行哪些修改以程序在IIS7的集成模式下能完全生效呢,主要包含以下几个方面:
(1) ----- 相当于中的
(2) ----- 相当于中的
(3) 下的 ----- 相当于中的
以上三点中,如果你的程序中有自定义的httpModules或者httpHandlers的话,那么第一点和第二点非常重要,具体资料请MSDN。
配置
error statusCode="404" path="/404.htm" responseMode="ExecuteURL" />
补充 errorMode有三个值,分别为Custom、DetailedLocalOnly、Detailed,意思为对用户与服务器端始终显示自定义页面、只能服务器端显示详细出错信息、对用户与服务器端始终显示详细出错信息。
responseMode有File、ExecuteUrl、Redirect三个层,分别表示使用服务器端静态文件、可执行的URL、URL转向。
注意:与是不同的,前者主要用于处理http相关的错误信息,而后者主要是处理应用程序级的错误页转向。
同样,如果Application_Error和同时存在,也存在执行顺序的问题。因为优先级 Application_Error事件> 配置项,所以发生应用程序级错误时,优先执行Application_Error事件中的代码,如果 Application_Error事件中调用了Server.ClearError()函数,配置节中的 defaultRedirect不起作用,因为Exception已经被清除;如果Application_Error事件中没用调用了 Server.ClearError()函数,错误页会重新定位到defaultRedict指定的URL页面,为用户显示友好出错信息。
通过对.NET提供的以上四种错误处理机制的分析,我们可以把它们从不同的角度分类,便于我们理解和使用。
1、从功能上分类:用于异常处理(Handling exceptions)是Page_Error事件和Application_Error事件;用户错误页面重定向(Redirecting the user to an error page)的是 ErrorPage属性和 配置项。
2、从错误处理的范围分类:用于页面级(Page level)错误处理的是Page_Error事件和 ErrorPage属性;用于应用程序级(Application level)错误处理的是Application_Error事件和 配置项。
IIS早应该 这样了,tomcat 就是iis7,apache 就是iis6.稀饭这个
2012年01月17日
IIS 改善和发展的主要因素是IIS已经成为应用程序(特别是ASP.NET)的支持平台。通过将ASP.NET直接集成到 IIS 7.0 中,IIS 7.0进一步推动了平台的发展。从管理功能到身份验证,乃至请求处理管道本身,相关功能都已经集成到IIS 7.0之中。
将管道集成到IIS 7.0中具有两个好处:一是为基于ASP.NET的Web应用程序及IIS 7.0扩展提供了更好的性能,二是通过使用托管代码获得了更好的控制能力。
IIS 7.0可以支持两种管道模式:一种是IIS 7.0最新提供的集成管道模式,另一种是经典管道模式,这种模式是由先前版本的IIS提供的。我们可以在应用程序池级设置管道模式,这项功能对IIS管理员尤其有用,因为这样既可以令一台服务器仅运行一种模式,也可以令两种模式同时运行于一台服务器上。
ASP.NET的性能之所以能够得到改善,是因为ASP.NET应用程序不再需要退出管道并加载ISAPI进程来处理ASP.NET代码,然后再返 回到管道为客户提供响应信息。为了保持应用程序的兼容性,IIS 7.0仍然支持经典管道模式,但是,现在应该尽可能地使用新的集成管道。
1. 经典模式
在IIS 6.0中,ASP.NET扮演了一个ISAPI过滤器的角色,也就是说,请求退出管道后,由aspnet.dll进行处理,然后返回到管道进行进一步处 理,最终将响应返回给客户端。在IIS 6.0中,一个客户端的HTTP请求将沿着管道移动,直到确定了一个处理程序,如果这个文件是一个ASP.NET文件,那么它就转入ASP.NET ISAPI过滤器,通过ISAPI的处理,在将一个HTTP响应返回给客户端之前,这个请求还将返回管道。IIS 7.0继续提供了这种模式,称为经典模式。
在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. 集成管道模式
利用IIS 7.0中的集成管道,开发人员可以将自己的托管代码在管道中集成为一个模块。在先前版本的IIS中,这需要开发ISAPI过滤器或应用程序,对多数开发人 员而言,这是一项难度很高的工作。在IIS 7.0中,可以用托管代码开发模块,并且模块可以作为请求管道的组成部分。利用IIS 7.0的集成管道模式,可以在管道中处理ASP.NET文件,这样可以在处理过程的任意一个步骤使用ASP.NET代码。因为ASP.NET已经集成到管 道中,所以,诸如身份验证之类的ASP.NET功能也可以用于处理非ASP.NET内容。每个请求都可以由IIS和ASP.NET进行处理,而不必考虑其 所属类型。
与ASP.NET集成也意味着可以使用ASP.NET身份验证对任何文件、文件夹,以及IIS 7.0的功能,从而有效地进行访问控制。在IIS 7.0出现之前,因为ASP.NET需要退出管道才能完成处理工作,所以任何不是由ASP.NET处理的文件,如HTML、Perl,甚至图形图像等内 容,都无法由ASP.NET进行处理,因此也不会由ASP.NET身份验证机制来进行访问控制。所以,就必须使用Windows集成的身份验证或自定义的 身份验证机制对不是由ASP.NET处理的文件进行访问控制。利用集成管道,可以大大简化身份验证方法的开发工作,可以将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. 两种模式之间配置的区别
IIS 7.0对配置文件进行了一些修改,Web开发人员可以使用这些修改内容。例如,节就是这样一项修改,无 论是经典模式还是集成模式都可以识别节,同时,节既 可以在applicationHost.config文件中设置,也可以在web.config文件中设 置。节既可以控制静态页面,也可以控制动态页面。即使在经典模式 中,节也具有重要作用,它可以帮助Web开发人员在web.config文件中设置不同的IIS配置。
在集成模式中,HTTP模块和HTTP处理程序不再定义于中,而是定义于中。如果在集成模式中运行一个包括了HTTP模块或HTTP处理程序的web.config文件,那 么将会发生失效。幸运的是,微软公司已经详细规定了一个编号为500.22的错误信息,这个错误信息说明了如何一步步地迁移web.config文件(参 见下图)。
注意,web.config文件中仍然保留了httpModules节,其目的在于向后兼容,但是,在system.webServer 中,modules节则处于优先的地位。validateIntegratedMode Configuration属性可以确保IIS不会因为存在遗留的节而产生问题。
集成管道模式是默认的管道模式,具有一些比较重要的优势。我们需要做的就是迁移定义了HTTP处理程序和HTTP模块的所有web.config文件,从而确保其能够在IIS 7.0下正常工作。
IIS 7.5 中配置 节点
问题
在 IIS7.5 中配置 节点的404页面不起作用
分析
节点是iis7.0之前版本的主要配置节点,在II7.0以后IIS管道处理与ASP.NET管道处理进行了 集成,提高了ASP.NET的处理性能。由于程序运行在IIS7.5集成模式下,需要在节点中配置,新 增加的节点中需要进行哪些修改以程序在IIS7的集成模式下能完全生效呢,主要包含以下几个方面:
(1) ----- 相当于中的
(2) ----- 相当于中的
(3) 下的 ----- 相当于中的
以上三点中,如果你的程序中有自定义的httpModules或者httpHandlers的话,那么第一点和第二点非常重要,具体资料请MSDN。
配置
error statusCode="404" path="/404.htm" responseMode="ExecuteURL" />
补充 errorMode有三个值,分别为Custom、DetailedLocalOnly、Detailed,意思为对用户与服务器端始终显示自定义页面、只能服务器端显示详细出错信息、对用户与服务器端始终显示详细出错信息。
responseMode有File、ExecuteUrl、Redirect三个层,分别表示使用服务器端静态文件、可执行的URL、URL转向。
注意:与是不同的,前者主要用于处理http相关的错误信息,而后者主要是处理应用程序级的错误页转向。
同样,如果Application_Error和同时存在,也存在执行顺序的问题。因为优先级 Application_Error事件> 配置项,所以发生应用程序级错误时,优先执行Application_Error事件中的代码,如果 Application_Error事件中调用了Server.ClearError()函数,配置节中的 defaultRedirect不起作用,因为Exception已经被清除;如果Application_Error事件中没用调用了 Server.ClearError()函数,错误页会重新定位到defaultRedict指定的URL页面,为用户显示友好出错信息。
通过对.NET提供的以上四种错误处理机制的分析,我们可以把它们从不同的角度分类,便于我们理解和使用。
1、从功能上分类:用于异常处理(Handling exceptions)是Page_Error事件和Application_Error事件;用户错误页面重定向(Redirecting the user to an error page)的是 ErrorPage属性和 配置项。
2、从错误处理的范围分类:用于页面级(Page level)错误处理的是Page_Error事件和 ErrorPage属性;用于应用程序级(Application level)错误处理的是Application_Error事件和 配置项。
IIS早应该 这样了,tomcat 就是iis7,apache 就是iis6.稀饭这个