2010-05-18 17 views
22

Próbuję skonfigurować ELMAH do filtrowania błędów 404 i mam problemy z regułami filtrowania dostarczonymi przez XML w moim pliku Web.config. Postępowałem zgodnie z instrukcją here i here i dodałem deklarację <is-type binding="BaseException" type="System.IO.FileNotFoundException" /> pod moją deklaracją <test><or>..., ale to się całkowicie nie udało.ELMAH - Filtrowanie 404 błędów

Kiedy testowałem go lokalnie Wsadziłem breakpoint w void ErrorLog_Filtering() {} z Global.asax i stwierdził, że System.Web.HttpException że zostanie zwolniony przez ASP.NET do 404 nie wydaje się mieć typ bazowy System.IO.FileNotFound, ale raczej go jest po prostu System.Web.HttpException. Przetestowałem to, wywołując e.Exception.GetBaseException().GetType() w procedurze obsługi zdarzeń.

Następnie zdecydowałem się wypróbować <regex binding="BaseException.Message" pattern="The file '/[^']+' does not exist" /> w nadziei, że jakikolwiek komunikat o wyjątku pasujący do wzorca "Plik"/foo.ext "nie istnieje" zostanie odfiltrowany, ale to również nie przyniesie efektu. W ostateczności próbowałem <is-type binding="BaseException" type="System.Exception" />, a nawet to jest całkowicie lekceważone.

Jestem skłonny pomyśleć, że istnieje błąd konfiguracji z ELMAH, ale nie widzę żadnego. Czy brakuje mi czegoś oczywistego?

Oto istotne rzeczy z mojego 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

że 2-gie Link rzuca 404. Oh ironia ... – Baldy

+0

@Baldy Niestety, jest to nowy rozwój. Możesz odnieść się do mojej próbki konfiguracji, aby uzyskać to, czego potrzebujesz. –

+1

W porządku Nathan, temat był pomocny. Po prostu uznałem za zabawne, że temat jest około 404, a jedno z linków na stronie prowadzi do 404 :) – Baldy

Odpowiedz

38

To rzeczywiście był błąd konfiguracji, po prostu nie jeden, który był szczególnie oczywiste.

Kolejność, w jakiej zarejestrowane są moduły HttpModuły ELMAH, jest istotnym problemem, ponieważ aby ELMAH mógł odfiltrować wyjątek, musi najpierw wiedzieć, które moduły będą zużywać wyjątek. HttpModule ErrorFilter musi być zarejestrowany ostatni, aby uniemożliwić innym modułom przetwarzanie odfiltrowanego wyjątku. Wydaje mi się, że to coś w rodzaju odwrotu, ale przynajmniej działa.

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

Po zapoznaniu się z ELMAH Wiki entry on ErrorFiltering ponownie odkryłem ten mały smakołyk informacji który naprawdę zasługuje na < silny/> tag, jeśli chodzi o mnie . (Edit: Oni pogrubione go odkąd pierwszy odpowiedział na to pytanie, rekwizytów!)

Pierwszym krokiem jest skonfigurowanie dodatkowy moduł o nazwie Elmah.ErrorFilterModule. Upewnij się dodać po każdym z modułów logowania z ELMAH, jak pokazano tu z ErrorLogModule:

Powiązane problemy