【问题标题】:Elmah not emailing Exceptions in MVC3, but will email page errors, 404, etcElmah 不会通过电子邮件发送 MVC3 中的异常,但会通过电子邮件发送页面错误、404 等
【发布时间】:2012-01-21 10:02:23
【问题描述】:

我想不通。 Elmah 不会记录控制器内部发生的异常。例如,不会为此生成电子邮件:

  [Authorize]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Reply(ReplyViewModel viewModel)
    {

      throw new Exception("Test");
     ....
    }

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>
    <!--<errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="elmah-sql"   >
    </errorLog>-->
    <errorMail from="somewhere@somewhere.com"
       to="errors@somewhere.com"
       subject="Error Subject Line"
       async="true"
       smtpPort="25"
       smtpServer="ourstmpserver">
    </errorMail>
  </elmah>
  <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.Helpers, Version=1.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=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>
    </compilation>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880" />
    </authentication>
    <membership>
      <providers>
        <clear />
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
      </providers>
    </membership>
    <profile>
      <providers>
        <clear />
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/" />
      </providers>
    </profile>
    <roleManager enabled="false">
      <providers>
        <clear />
        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
        <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
      </providers>
    </roleManager>
    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages" />
      </namespaces>
    </pages>
    <httpModules>
      <!--<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />-->
      <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
      <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
    </httpModules>
    <httpHandlers>
      <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
    </httpHandlers>
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
      <!--<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />-->
      <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
      <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
    </modules>
    <handlers>
      <add name="Elmah" path="elmah.axd" verb="POST,GET,HEAD" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" />
    </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-2.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

但是,如果我导航到一个我没有控制器/操作的 URL,我会收到一封来自 Elmah 的电子邮件。

什么给了?发生异常时我真的需要电子邮件...

【问题讨论】:

  • elmah 是否记录错误?也就是说,如果您执行回复操作,并看到 ysod 或其他任何内容,您能否在 /elmah.axd 处理程序 URL 的日志中看到异常?
  • 您是否尝试将 customErrors 模式设置为 Off ?我最近发现了同样的问题,当我切换它时,Elmah 中开始出现错误
  • 自定义错误已关闭。还是什么都没有。
  • @olivehour 它根本不记录异常。我将其更改为内存日志,因为我们实际上并不关心日志记录,只关心异常的电子邮件。当它遇到我在控制器中抛出的异常时,Elmah 什么都不做。这很奇怪。
  • 对不起,我应该注意到了。为了清楚起见,如果您取消注释错误日志模块,它也根本不记录?

标签: asp.net-mvc asp.net-mvc-3 smtp elmah


【解决方案1】:

尝试使用 NuGet 上提供的 Elmah.Contrib.Mvc。

我们使用这个包,并在我们的 Global.asax 中注册它们的 HandleErrorAttribute,如下所示:

private static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    //filters.Add(new HandleErrorAttribute()); // default MVC setting
    filters.Add(new ElmahHandleErrorAttribute()); // from Elmah.Contrib.Mvc
}

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题,最后通过源码调试解决了:Download Source

    在我的例子中,Thread.CurrentPrincipalCurrentPrincipal 替换为 Identity = null,这导致了异常,因为 Elmah 使用的是 CurrentPrincipal.Identity.Name

    捕获 Elmah 自身内部的所有异常,以防止您的程序因日志记录异常而崩溃,在这种情况下,原始异常也会丢失。

    这只是我的案例中出现问题的一个示例,Elmah 本身引起的任何异常都会导致这种行为。因此,应使用源代码进行调试。另一种方法是查看 Trace,因为 Elmah 正在将任何捕获的异常写入 Trace。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 2012-11-17
      • 2012-03-30
      • 1970-01-01
      • 2017-01-21
      • 2013-01-16
      • 2012-07-20
      相关资源
      最近更新 更多