ASP.NET 黄屏死机 (YSOD) 可以按需生成或捕获吗?

Can the ASP.NET Yellow Screen of Death (YSOD) be generated on demand or captured?

提问人:nicknystrom 提问时间:5/19/2009 最后编辑:Tim Sylvesternicknystrom 更新时间:10/20/2011 访问量:4850

问:

例如,我们只想从 Global.asax 错误处理程序捕获 YSOD 输出以用于 erorr 报告电子邮件。有什么方法可以利用内置的 ysod 生成器吗?

asp.net 错误报告 错误记录 黄屏死机

评论


答:

2赞 Jeremy 5/19/2009 #1

您应该查看 ELMAH,它会自动执行您的要求。

2赞 RSolberg 5/19/2009 #2

我想说的是,一般来说,您不希望用户体验 YSOD。这是我之前在 Web 应用程序中放置的东西,用于捕获错误,然后为用户提供更优雅的错误页面......

protected void Application_Error(object sender, EventArgs e)
{
    MailMessage msg = new MailMessage();
    HttpContext ctx = HttpContext.Current;

    msg.To.Add(new MailAddress("[email protected]"));
    msg.From = new MailAddress("[email protected]");
    msg.Subject = "My app had an issue...";
    msg.Priority = MailPriority.High;

    StringBuilder sb = new StringBuilder();
    sb.Append(ctx.Request.Url.ToString() + System.Environment.NewLine);
    sb.Append("Source:" + System.Environment.NewLine + ctx.Server.GetLastError().Source.ToString());
    sb.Append("Message:" + System.Environment.NewLine + ctx.Server.GetLastError().Message.ToString());
    sb.Append("Stack Trace:" + System.Environment.NewLine + ctx.Server.GetLastError().StackTrace.ToString());
    msg.Body = sb.ToString();

    //CONFIGURE SMTP OBJECT
    SmtpClient smtp = new SmtpClient("myhost");

    //SEND EMAIL
    smtp.Send(msg);

    //REDIRECT USER TO ERROR PAGE
    Server.Transfer("~/ErrorPage.aspx");
}
3赞 markt 5/19/2009 #3

你听说过ELMAH吗?它可能会为您提供您真正想要的所有功能......

这是一篇博客文章,对此进行了一些解释:http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx

9赞 Andrew Hare 5/19/2009 #4

我会研究 ELMAH(ASP.NET 的错误记录模块和处理程序):

ELMAH(错误记录模块和 Handlers) 是应用程序范围的错误 完全的伐木设施 可插拔。它可以动态添加 到正在运行的 ASP.NET Web 应用程序, 甚至所有 ASP.NET Web 应用程序 在机器上,不需要任何 重新编译或重新部署。

一旦 ELMAH 被放入 运行 Web 应用程序并配置 相应地,您将获得以下内容 设施无需更换 代码行:

  • 记录几乎所有未处理的异常。
  • 用于远程查看重新编码异常的整个日志的网页。
  • 一个网页,用于远程查看任何记录的完整详细信息 例外。
  • 在许多情况下,您可以查看原始的黄色死机屏幕 ASP.NET 为给定生成的 异常,即使使用 customErrors 模式也是如此 关闭。
  • 每个错误发生时的电子邮件通知。
  • 日志中最后 15 个错误的 RSS 源。

评论

0赞 jpaugh 4/19/2018
看起来 ELMAH 已移至 GitHub,但(原始)Google Code 存档中没有这方面的信息。
1赞 Dillie-O 5/19/2009 #5

每当应用程序中发生未经处理的异常时,都会触发 Global.asax 文件中的 Application_Error 事件。您可以使用 Server.GetLastError() 方法获取发生的最后一个异常。

同样,可以通过在 web.config 文件的 customErrors 部分下的 web.config 中指定它来创建自己的自定义错误页。通过指定默认文件,您可以在将异常路由到该文件时执行任何自定义编码。

8赞 Philippe 10/20/2011 #6

是的,有一种方法可以做到这一点。

在 global.asax 文件的 Application_Error 事件中,获取最后一个异常作为 System.HttpUnhandledException。您的代码将如下所示:

var lastException = Server.GetLastError() as HttpUnhandledException;
string Ysod = lastException.GetHtmlErrorMessage();
// your call to emailing routine follows

我同意其他人的评论。您也可以使用 ELMAH 执行此操作。

评论

0赞 nicknystrom 8/1/2012
3 年过去了,谁知道为什么我不想使用 ELMAH,但这是我肯定在寻找的答案。我猜不想在一个已经充斥着第三方模块的繁忙项目中采用另一个依赖项。
1赞 Nick Albrecht 10/30/2012
这正是我一直在寻找的,我在我的项目中使用 Elmah,但是在用户是管理员的情况下,我想显示详细的 YSOD,而不仅仅是友好的错误消息。
0赞 Piotr Kula 10/21/2015
我在其他项目中使用了 Elmah,但在这种情况下,我想控制错误日志记录,因为 sh!t 太严重了,即使对 Elmah 也是如此!这正确地回答了最初的问题,至今仍然叹息