2009-07-31 19 views
9

Mam następujące ustawienia w moim web.config:ELMAH filtrowanie nie działa

<configSections> 
    <sectionGroup name="elmah"> 
     <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah"/> 
     <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" /> 
     <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" /> 
     <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah"/> 
    </sectionGroup> 
</configSections> 

<elmah> 
    <security allowRemoteAccess="0" /> 
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="MyConnHere" /> 
</elmah> 

<system.web> 
    <httpHandlers> 
     <remove verb="*" path="*.asmx"/> 
     <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/> 
     <add verb="*" path="*.mvc" validate="false" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" /> 
    </httpHandlers> 
    <httpModules> 
     <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/> 
     <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />    
     <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/> 
    </httpModules> 
</system.web> 

i następujące w moim pliku Global.asax:

public void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e) 
{ 
    Filter(e); 
} 

public void ErrorMail_Filtering(object sender, ExceptionFilterEventArgs e) 
{ 
    Filter(e); 
} 

private void Filter(ExceptionFilterEventArgs e) 
{ 
    var context = e.Context as HttpContext; 

    if (context != null && context.Response.StatusCode == 404) 
     e.Dismiss(); 

    if (e.Exception.GetBaseException() is FileNotFoundException || 
     e.Exception.GetBaseException() is HttpRequestValidationException) 
     e.Dismiss(); 
} 

a jednak za każdym razem, logi ELMAH 404 wyjątków. Używam ASP.NET MVC; są wyświetlane jako wyjątek System.Web.HttpException, a nie FileNotFound, ale kod stanu nadal wynosi 404, więc filtr powinien być zgodny, ale nie wydaje się, aby działał w ogóle.

Co robię źle?

+0

Okazuje się, że kod stanu brzmi 200 ... dlaczego? – Chris

+0

Kod stanu odpowiedzi to 200, ale wyjątek brzmi: "Publicznej metody działania" Register3 "nie można znaleźć na kontrolerze" controllernamehere "." – Chris

Odpowiedz

10

Znaleziono odpowiedź. Metoda Filter musi sprawdzić wynik metody HttpException.GetHttpCode(), zamiast sprawdzać właściwość Response.StatusCode.

private void Filter(ExceptionFilterEventArgs e) 
{ 
    var exception = e.Exception.GetBaseException(); 
    var httpException = exception as HttpException; 

    if (httpException != null && 
     httpException.GetHttpCode() == 404) 
     e.Dismiss(); 

    if (exception is FileNotFoundException || 
     exception is HttpRequestValidationException || 
     exception is HttpException) 
     e.Dismiss(); 
} 
+0

Dzięki za to, miałem ten sam problem i twój post pomógł. Ale z ciekawości, i prawdopodobnie jestem tutaj gęsty, ale kombinacja zdań if jest dla mnie kłopotliwa, ponieważ druga, jeśli sprawdza wszystkie HttpExceptions i odrzuca, więc pierwsze zdanie byłoby bez sensu, ponieważ wyjątek i tak by się nie powiódł? Dzięki Paul –

+0

Paulie, masz rację. Prawdopodobnie nie powinienem był uwzględniać wyjątku HttpException w drugim wyrażeniu if, ponieważ chciałem tylko zignorować określone wyjątki HttpExceptions, w których kod stanu wynosił 404. – Chris