2011-05-06 43 views
7

我遇到了构建的自定义错误处理程序的问题。它应该是HttpModule,但是当我将它添加到我的web.configsystem.webServer/modules标记中时,它不会启动。用于集成的IIS 7的自定义HttpModule

这是我web.config部分:

<system.webServer> 
    <modules> 
    <add name="AspExceptionHandler" 
     type="Company.Exceptions.AspExceptionHandler, Company.Exceptions" 
     preCondition="managedHandler" /> 
    </modules> 
</system.webServer> 

这是我HttpModule代码:

using System; 
using System.Web; 
using Company.Settings; 
using System.Configuration; 

namespace Company.Exceptions 
{ 
    public class AspExceptionHandler : IHttpModule 
    { 
    public void Dispose() { } 

    public void Init(HttpApplication application) 
    { 
     application.Error += new EventHandler(ErrorHandler); 
    } 

    private void ErrorHandler(object sender, EventArgs e) 
    { 
     HttpApplication application = (HttpApplication)sender; 
     HttpContext currentContext = application.Context; 

     // Gather information5 
     Exception currentException = application.Server.GetLastError(); 
     String errorPage = "http://www.mycompaniesmainsite.com/error.html"; 

     HttpException httpException = currentException as HttpException; 
     if (httpException == null || httpException.GetHttpCode() != 404) 
     {   
     currentContext.Server.Transfer(errorPage, true); 
     } 
     else 
     { 
     application.Response.Status = "404 Not Found"; 
     application.Response.StatusCode = 404; 
     application.Response.StatusDescription = "Not Found"; 
     currentContext.Server.Transfer(errorPage, true); 
     } 
    } 
    } 
} 

可能有人请向我解释什么,我做错了,以及如何IIS 7的集成管理管道模式有效吗?因为我发现的大部分答案都是关于为IIS 6配置HttpModules

回答

3

从我所看到的你正确的轨道上。你确定你的网站的应用程序池被设置为管理流水线模式吗?

此外,如果您使用内置的Visual Studio Web服务器(Cassini)测试此功能,那么<system.webServer>部分将被忽略。如果您希望从那里加载模块,您将需要IIS7或IIS7.5 Express。

+0

感谢您的响应速度快,我没有设置应用程序池管理的管道模式。我在本地机器上使用IIS Express试用了它,当这种情况不起作用时,我将该站点发布到了IIS 7的服务器。在那里,我可以看到模块正在加载,但它永远不会被解雇。所以我正在做其他事情,我做错了... – 2011-05-10 06:41:45

+0

在我的web.config和一些干净/生成解决方案的语法错误,并在稍后发布,它似乎工作... – 2011-05-11 13:13:14

+0

@jonas - 不错的一个:) – Kev 2011-05-11 13:14:20

0

我遇到了一个处理程序没有被触发的相同问题,通过对上述代码进行以下更改帮助我解决了此问题。我只是将具有相同签名的方法附加到该事件上,而不是创建新的事件处理程序。

application.Error += ErrorHandler; 

这适用于我,仍然分析这种方式背后的原因是什么附加处理程序在IIS7中工作。

0

我有这个问题,发现不关闭customErrors阻止处理程序触发。

即:这是在你的配置为错误事件需要在HTTP模块捕获:

<system.web> 
    <customErrors mode="Off" /> 
</system.web>