【问题标题】:Send email on 500 Error Asp.net MVC在 500 错误 Asp.net MVC 上发送电子邮件
【发布时间】:2018-05-10 11:45:07
【问题描述】:

如果我的 MVC 应用程序中出现 500 异常错误,我想发送一封电子邮件以提醒网站所有者。

我在 global.asax.cs 文件中发现了 Application_Application_Error 方法,该方法在应用程序出现错误时触发。

我想知道的是,用这种方法发送邮件是否安全,如果发生意外错误会怎样?应用程序最终会陷入无限循环吗?杀死我的网络服务器?

以前有没有人做过类似的事情,有没有更好的方法?

【问题讨论】:

  • “如果发生意外错误会怎样?应用程序是否会陷入无限循环?杀死我的网络服务器?” - 这取决于会发生什么意外错误。 “用这种方法发送电子邮件是否安全” - 我看不出有什么问题,这只是某种日志记录,因此您正在将特定错误记录到电子邮件中。
  • “应用程序会进入死循环吗?” - 不会。但是如果发送电子邮件时出错,那么电子邮件当然不会发送。您可能希望将您的逻辑包装在 try/catch 中,并按照您的定义处理此类错误。
  • 我认为您不应该为所有例外情况发送邮件。您可以创建日志文件或将其保存在数据库中。仅针对特定例外或自定义例外发送邮件。

标签: c# asp.net-mvc error-handling application-error


【解决方案1】:

如果您使用的是 MVC,为什么不使用可以添加到整个应用程序的操作过滤器?

public class CustomErrorHandler : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        try{
            //Send email
        }
        catch{
           //Swallow...
        }
        base.OnException(filterContext);
    }
}

然后在你的FilterConfig.cs

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
   filters.Add(new CustomErrorHandler());       
}

如果您在过滤器中吞下异常,则它不会冒泡并在您的应用中创建任何循环。另外,您可以对错误处理进行更精细的控制。

【讨论】:

  • 吞下异常并不是最好的主意。您永远不会知道您的邮件已损坏。
  • 电子邮件错误对于冒泡并不重要,如果应用程序崩溃,那么我宁愿获取根本原因错误堆栈跟踪,也不愿获得错误记录失败的无用错误。
  • 电子邮件错误很重要,因为它表明您的日志没有按预期工作,这个错误至少应该写入通常的日志文件。如果邮件失败并且所有异常都被忽略,现在可能会发生无声崩溃。
  • 将电子邮件错误写入日志文件类似于吞下它,因为您不希望电子邮件错误冒出并覆盖过滤器正在处理的实际异常...跨度>
【解决方案2】:

通常使用某种库来执行日志记录:Nloglog4netSerilog 或其他。 大多数此类库都具有执行电子邮件通知的能力。您可以利用这些知识 — 在您的应用中执行简单且一致的日志记录,并通过为您选择的记录器进行适当配置来实现目标。

这可以通过使用来完成:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-17
    • 2011-04-18
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    相关资源
    最近更新 更多