ELMAH - фильтрация ошибок 404 - PullRequest
23 голосов
/ 18 мая 2010

Я пытаюсь настроить 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>

1 Ответ

39 голосов
/ 26 мая 2010

Это действительно была ошибка конфигурации, но не та, которая была особенно очевидна.

Порядок, в котором регистрируются HttpModules ELMAH, представляет собой актуальную проблему, поскольку для того, чтобы ELMAH отфильтровал исключение, он должен сначала знать, какие модули будут использовать исключение. HttpModule ErrorFilter должен быть зарегистрирован последним , чтобы другие модули не обрабатывали фильтруемое исключение. Это кажется [отчасти] задом наперед, но по крайней мере это работает.

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

После просмотра записи ELMAH Wiki о ErrorFiltering я снова обнаружил небольшой кусочек информации , который действительно заслуживает тега , если вы спросите меня . ( Редактировать : Они набросились на это с тех пор, как я впервые ответил на этот вопрос; реквизит!)

Первым шагом является настройка дополнительного модуля Elmah.ErrorFilterModule. Убедитесь, что вы добавили его после любого из модулей журналов от ELMAH, как показано здесь с ErrorLogModule:

...