2011-05-06 52 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>