在集成模式中,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 的改进。
您可能感兴趣的文章: