2009-07-31 14 views
9

ho le seguenti impostazioni nel mio web.config:filtraggio ELMAH non funziona

<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> 

e di seguito nel mio file 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(); 
} 

Eppure ogni singola volta, i registri ELMAH 404 eccezioni. Sto usando ASP.NET MVC; vengono visualizzati come tipo System.Web.HttpException, non come eccezione FileNotFound, ma il codice di stato è ancora 404 e quindi il filtro deve corrispondere, ma non sembra funzionare affatto.

Cosa sto sbagliando?

+0

Si scopre che il codice di stato indica 200 ... perché? – Chris

+0

Il codice di stato della risposta è 200, ma si legge l'eccezione: "Impossibile trovare un metodo di azione pubblica 'Register3' sul controller 'controllerernamehere'." – Chris

risposta

10

Trovato la risposta. Il metodo Filter deve controllare il risultato del metodo HttpException.GetHttpCode(), piuttosto che controllare la proprietà 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

Grazie per questo, ho avuto lo stesso problema e il tuo post ha aiutato. Però comunque, e probabilmente sono denso qui, ma la combinazione di se le affermazioni mi sconcertano perché la seconda, se sta controllando tutte le HttpException e le revisioni, quindi la prima affermazione sarebbe inutile in quanto l'eccezione verrebbe comunque respinta? Grazie Paul –

+0

Paulie, hai ragione. Probabilmente non avrei dovuto includere HttpException nella seconda istruzione if, dal momento che volevo ignorare specifiche HttpException in cui il codice di stato era 404. – Chris