Подтвердить что ты не робот

ELMAH - фильтрация ошибок 404

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

Ответ 1

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

Порядок регистрации ELMAH HttpModules является серьезной проблемой, поскольку для 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>

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

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