Я пытаюсь настроить ELMAH для фильтрации ошибок 404, и у меня возникают проблемы с правилами фильтрации, предоставленными в XML, в моем файле Web.config. Я следовал учебному пособию здесь и здесь и добавил объявление <is-type binding="BaseException" type="System.IO.FileNotFoundException" />
в моем объявлении <test><or>...
, но это полностью провалилось.
При локальном тестировании я застрял точку останова в void ErrorLog_Filtering() {}
файла Global.asax и обнаружил, что System.Web.HttpException
, который запускается ASP.NET для 404, похоже, не имеет базового типа System.IO.FileNotFound
, а скорее это просто System.Web.HttpException
. Я проверил это, вызвав e.Exception.GetBaseException().GetType()
в обработчике событий.
Затем я решил попробовать <regex binding="BaseException.Message" pattern="The file '/[^']+' does not exist" />
в надежде на то, что любое сообщение об исключении, соответствующее шаблону "файл '/foo.ext' не существует", будет отфильтровано, но это также не имеет никакого эффекта. В крайнем случае я попытался <is-type binding="BaseException" type="System.Exception" />
, и даже это полностью игнорируется.
Я склонен думать, что в ELMAH есть ошибка конфигурации, но я ее не вижу. Я что-то упускаю явно очевидное?
Вот соответствующие материалы из моего 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>