2010-05-18 14 views
22

Ich versuche ELMAH zu konfigurieren, 404 Fehler zu filtern, und ich stehe in Schwierigkeiten mit den XML-bereitgestellten Filterregeln in meiner Datei Web.config. Ich folgte dem Tutorial here und here und fügte eine <is-type binding="BaseException" type="System.IO.FileNotFoundException" /> Deklaration unter meiner <test><or>... Deklaration hinzu, die aber komplett fehlschlug.ELMAH - Filterung 404 Fehler

Wenn ich es lokal teste ich einen Haltepunkt in void ErrorLog_Filtering() {} des Global.asax stecken und festgestellt, dass die System.Web.HttpException, die für ein 404 von ASP.NET wird ausgelöst, scheint nicht zu einem Basistyp von System.IO.FileNotFound zu haben, sondern es ist einfach eine System.Web.HttpException. Ich habe dies getestet, indem ich im Event-Handler e.Exception.GetBaseException().GetType() aufgerufen habe.

Als nächstes entschied ich mich zu versuchen, eine <regex binding="BaseException.Message" pattern="The file '/[^']+' does not exist" /> in der Hoffnung, dass jede Ausnahmemeldung mit dem Muster "Die Datei '/ foo.ext' existiert nicht" würde gefiltert werden, aber das hat auch keine Wirkung. Als letzten Ausweg habe ich versucht <is-type binding="BaseException" type="System.Exception" />, und selbst das wird völlig ignoriert.

Ich bin geneigt zu denken, es gibt einen Konfigurationsfehler mit ELMAH, aber ich sehe keine. Fehle ich etwas offensichtlich offensichtlich?

Hier ist die relevanten Sachen aus meinem web.config:

<configuration> 
    <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> 
    <errorFilter> 
     <test> 
     <or> 
      <equal binding="HttpStatusCode" value="404" type="Int32" /> 
      <regex binding="BaseException.Message" pattern="The file '/[^']+' does not exist" /> 
     </or> 
     </test> 
    </errorFilter> 
    <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/App_Data/logs/elmah" /> 
    </elmah> 
    <system.web> 
    <httpModules> 
     <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/> 
     <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/> 
    </httpModules> 
    </system.web> 
    <system.webServer> 
    <modules> 
     <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/> 
     <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" /> 
    </modules> 
    </system.webServer> 
</configuration> 
+2

, dass der 2. Link wirft einen 404. Oh die Irony ... – Baldy

+0

@Baldy Leider ist eine Neuentwicklung. Sie können auf mein Konfigurationsbeispiel für das, was Sie benötigen, verweisen. –

+1

ist es gut Nathan, das Thema war hilfreich. Ich fand es einfach witzig, dass das Thema über 404s ist, und einer der Links auf der Seite führt zu einem 404 :) – Baldy

Antwort

38

Es war in der Tat ein Konfigurationsfehler, nur nicht eine, die besonders offensichtlich war.

Die Reihenfolge, in der die ELMAH HttpModule registriert werden, ist ein relevantes Problem, da ELMAH die Filterung der Ausnahmebedingungen erst dann kennen muss, wenn die Module die Ausnahme verarbeiten. Das ErrorFilter HttpModule muss zuletzt registriert sein, um zu verhindern, dass die anderen Module die zu filternde Ausnahme verarbeiten. Das scheint mir irgendwie rückständig zu sein, aber zumindest funktioniert es.

<configuration> 
    ... 
    <system.web> 
    <httpModules> 
     <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/> 
     <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/> 
    </httpModules> 
    </system.web> 
    <system.webServer> 
    <modules> 
     <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" /> 
     <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/> 
    </modules> 
    </system.webServer> 
</configuration> 

Nach dem ELMAH Wiki entry on ErrorFiltering wieder Überprüfung entdeckte ich dieses kleine Leckerbissen der Informationen die wirklich einen < stark/> Tag verdient, wenn Sie mich fragen . (bearbeiten: Sie haben es fett gedruckt, da ich zum ersten Mal diese Frage beantwortet, Requisiten!)

Der erste Schritt ist ein zusätzliches Modul konfigurieren Elmah.ErrorFilterModule genannt. Stellen Sie sicher, dass Sie es nach einem der Logging-Module von ELMAH hinzufügen, wie hier mit ErrorLogModule gezeigt: