2011-05-06 16 views
7

Mam problemy z niestandardową obsługą błędów, którą zbudowałem. Powinien to być HttpModule, ale kiedy dodaję go do mojego tagu web.config, system.webServer/modules, nie jest on inicjowany.Niestandardowy moduł HttpModule dla IIS 7 dla zintegrowanego

To mój web.config sekcja:

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

Jest to kod w moim 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); 
     } 
    } 
    } 
} 

Czy ktoś mógłby wyjaśnić mi, co robię źle i jak IIS 7 Zintegrowany Zarządzane Tryb Pipeline działa? Ponieważ większość odpowiedzi, które znalazłem, dotyczy konfiguracji HttpModules dla IIS 6.

Odpowiedz

3

Z tego, co widzę, jesteś na dobrej drodze. Czy upewniłeś się, że pula aplikacji Twojej witryny jest ustawiona na tryb Managed Pipeline?

Również jeśli testujesz to z wbudowanym serwerem Visual Studio (Cassini), sekcja <system.webServer> zostanie zignorowana. Będziesz potrzebował IIS7 lub IIS7.5 Express, jeśli chcesz, aby moduł był ładowany z tego miejsca.

+0

Dzięki za szybką odpowiedź, ja ustawić pulę aplikacji w trybie zarządzanym rurociągu. Wypróbowałem to przy użyciu ekspresu IIS na mojej maszynie lokalnej, a kiedy to nie zadziałało, opublikowałem witrynę na serwerze z usługami IIS 7. Tam widziałem moduł ładowany, ale nigdy nie został wyrzucony. Więc gessing jej coś innego robię źle ... –

+0

Błąd składni w moim web.config i niektóre czyste/kompilacji rozwiązanie i publikuje później, wydaje się działać ... –

+0

@jonas - nice one :) – Kev

0

Wystąpił ten sam problem obsługi, który nie jest wyzwalany, wykonując następujące zmiany powyższego kodu pomógł mi rozwiązać ten problem. Zamiast tworzyć nową procedurę obsługi zdarzeń, właśnie dołączałem metodę z tym samym sygnaturą do tego zdarzenia.

application.Error += ErrorHandler; 

To działa dla mnie, wciąż analizując, co jest przyczyną tego, że dołączanie obsługi działa w IIS7.

0

Miałem ten problem i odkryłem, że nie wyłączenie customErrors uniemożliwiło uruchomienie programu obsługi.

znaczy: jest to wymagane w config na zdarzenia błędu zostać ujęte w HttpModule:

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