2009-07-31 5 views
9

I ont les paramètres suivants dans mon web.config:filtrage ELMAH ne fonctionne pas

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

et suivants dans mon fichier 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(); 
} 

Et pourtant, à chaque fois, les journaux Elmah 404 exceptions. J'utilise ASP.NET MVC; ils apparaissent en tant que type System.Web.HttpException, pas l'exception FileNotFound, mais le code d'état est toujours 404 et le filtre doit correspondre, mais il ne semble pas fonctionner du tout.

Qu'est-ce que je fais mal?

+0

Il s'avère que le code d'état indique 200 ... pourquoi? – Chris

+0

Le code d'état de réponse est 200, mais l'exception se lit comme suit: "Une méthode d'action publique" Register3 "n'a pas pu être trouvée sur le contrôleur" controllernamehere "." – Chris

Répondre

10

J'ai trouvé la réponse. La méthode Filter doit vérifier le résultat de la méthode HttpException.GetHttpCode(), plutôt que de vérifier la propriété 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

Merci pour cela, j'avais le même problème et votre message a aidé. Mais par intérêt, et je suis probablement dense ici mais la combinaison de if est déconcertante parce que la seconde if vérifie toutes les HttpExceptions et les rejette donc la première instruction serait inutile car l'exception serait rejetée de toute façon? Merci Paul –

+0

Paulie, vous avez raison. Je n'aurais probablement pas dû inclure HttpException dans la seconde instruction if, puisque je voulais seulement ignorer des HttpExceptions spécifiques où le code d'état était 404. – Chris