ELMAH не регистрирует ошибки в приложении MVC 2 - PullRequest
1 голос
/ 03 февраля 2011

Я использую предложение из этого вопроса: Как заставить ELMAH работать с атрибутом ASP.NET MVC [HandleError]?

Я использовал второй пример кода Азиза.

Я запустил отладчик, чтобы посмотреть, что происходит при возникновении ошибки. Основная функция в классе HandleErrorAttribute:

public override void OnException(ExceptionContext context)
{
    base.OnException(context);

    var e = context.Exception;
    if (!context.ExceptionHandled   // if unhandled, will be logged anyhow
        || RaiseErrorSignal(e)      // prefer signaling, if possible
        || IsFiltered(context))     // filtered?
        return;

    LogException(e);
}

Доходит до утверждения if. context.ExceptionHandled возвращает true, RaiseErrorSignal(e) также возвращает true. IsFiltered никогда не достигается, он просто возвращается, а LogException(e) никогда не достигается.

Кто-нибудь сталкивался с этим?

РЕДАКТИРОВАТЬ: Добавление web.config

<?xml version="1.0" encoding="utf-8"?>
<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>
    <security allowRemoteAccess="0" />
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="AppDb" />
  </elmah>
  <appSettings></appSettings>
  <connectionStrings>
    <add name="AppDb" connectionString="metadata=res://*/Models.MyDB.csdl|res://*/Models.MyDB.ssdl|res://*/Models.MyDB.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\MyDB.mdf;Integrated Security=True;User Instance=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <system.web>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </assemblies>
    </compilation>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880" />
    </authentication>        
    <pages>
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
      </namespaces>
    </pages>
    <httpHandlers>
      <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
    </httpHandlers>
    <httpModules>
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
      <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
      <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
    </httpModules>
    <customErrors mode="On" defaultRedirect="Error.aspx">
      <error statusCode="403" redirect="NoAccess.htm" />
      <error statusCode="404" redirect="FileNotFound.htm" />
    </customErrors>
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
      <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
      <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
    </modules>
    <handlers>
      <add name="Elmah" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
    </handlers>
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

Ответы [ 3 ]

2 голосов
/ 03 февраля 2011

Похоже, что ваша строка подключения AppDb является строкой подключения Entity Framework.Я не думаю, что ELMAH был написан, чтобы признать этот формат.Попробуйте дать ELMAH стандартную строку соединения SQL и посмотрите, работает ли это.

0 голосов
/ 03 февраля 2011

Вызов RaiseErrorSignal(e) запишет ошибку в ELMAH, LogException(e) не нужно вызывать, если RaiseErrorSignal(e) возвращает true.

Если ELMAH настроен правильно, оба значения RaiseErrorSignal(e) и LogException(e) приведут к записи ошибки.Есть несколько причин, по которым RaiseErrorSignal(e) может возвращать false, поэтому LogException(e) существует просто как резервное копирование в случае сбоя сигнализации.

Если ошибки в ELMAH по-прежнему не отображаются, то, скорее всего, у вас возникли проблемы сваша конфигурацияНе могли бы вы опубликовать соответствующие части вашего Web.config, чтобы мы могли посмотреть?А именно, пожалуйста, опубликуйте раздел <elmah />, а также свои http-модули в <system.web /> или <system.webServer /> (если вы используете среду IIS7).

Обновление

Как указал Эрик КингВаша строка подключения 'AppDb' предназначена для Entity Framework.Он не будет работать как строка подключения ErrorLog.Если вы добавляете стандартную строку подключения в ваш Web.config и указываете на нее ErrorLog, ELMAH должен начать запись правильно.

В случае, если вы не знали - HttpModule ErrorFilter должен быть объявлен послелюбые модули это должно фильтровать.В вашем текущем Web.config, если вы хотите определить фильтр, он будет применяться только к модулю ErrorLog, а не к модулю ErrorMail.

0 голосов
/ 03 февраля 2011

Его логика короткого замыкания, поэтому он остановится на || RaiseErrorSignal(e) и не будет оценивать IsFiltered(context)

Тот факт, что context.ExceptionHandled имеет значение true, означает, что вы явно обработали исключение в своем коде с попыткойпоймать блок.В этом случае вам необходимо явно указать ELMAH, чтобы он также обработал ошибку:

catch (Exception ex)
{
    // do something 
    // etc

    // now tell ELMAH to handle it too
    ErrorSignal.FromCurrentContext().Raise(ex);
}
...