ASP.NET 黄屏死机 (YSOD) 能否按需生成或捕获?

Posted

技术标签:

【中文标题】ASP.NET 黄屏死机 (YSOD) 能否按需生成或捕获?【英文标题】:Can the ASP.NET Yellow Screen of Death (YSOD) be generated on demand or captured? 【发布时间】:2010-10-27 02:10:11 【问题描述】:

我们只想从 Global.asax 错误处理程序中捕获 YSOD 输出以在错误报告电子邮件中使用。有没有办法利用内置的 ysod 生成器?

【问题讨论】:

【参考方案1】:

我会调查ELMAH (Error Logging Modules and Handlers for ASP.NET):

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

一旦 ELMAH 被放入 运行 Web 应用程序并配置 适当地,你得到以下 设施不改单 你的代码行:

记录几乎所有未处理的异常。 用于远程查看重新编码异常的整个日志的网页。 一个网页可以远程查看任何登录的人的完整详细信息 例外。 很多情况下可以查看原版黄屏死机 为给定的 ASP.NET 生成的 异常,即使使用 customErrors 模式 已关闭。 每个错误发生时的电子邮件通知。 日志中最近 15 个错误的 RSS 提要。

【讨论】:

看起来 ELMAH 已移至 GitHub,但(原始)Google 代码存档中没有关于此的信息。【参考方案2】:

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

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

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

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

【讨论】:

3 年过去了,谁知道我为什么不想使用 ELMAH,但这确实是我一直在寻找的答案。我猜不想在一个已经充斥着 3rd 方模块的繁忙项目中使用另一个依赖项。 也正是我想要的,我在我的项目中使用 Elmah,但在用户是管理员的情况下,我想显示详细的 YSOD 而不仅仅是友好的错误消息。 我在其他项目中使用了 Elmah,但在这种情况下,我特别想控制错误记录,因为 sh!t 太严重了,即使对于 Elmah 也是如此!这正确回答了最初的问题,并且今天仍然存在 sigh【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

一般来说,您不希望用户体验 YSOD。这是我之前在网络应用程序中添加的内容,用于捕获错误,然后为用户提供更优雅的错误页面......

protected void Application_Error(object sender, EventArgs e)

    MailMessage msg = new MailMessage();
    HttpContext ctx = HttpContext.Current;

    msg.To.Add(new MailAddress("me@me.com"));
    msg.From = new MailAddress("from@me.com");
    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");

【讨论】:

【参考方案6】:

只要应用程序中发生未处理的异常,就会触发 Global.asax 文件中的 Application_Error 事件。您可以使用 Server.GetLastError() 方法获取上次发生的异常。

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

【讨论】:

以上是关于ASP.NET 黄屏死机 (YSOD) 能否按需生成或捕获?的主要内容,如果未能解决你的问题,请参考以下文章

如何从像 Asp.Net 这样的堆栈跟踪中获取“源错误”?

无法在 ASP.NET MVC 网站中获取详细的错误信息

如何在 ASP.NET MVC 中调试死机白屏

Azure ASP.NET Web Forms 能否用于构建 IoT 应用程序?

ASP.NET MVC中能否嵌套WEB控件页面使用?

Asp.net能否实现拖拽鼠标画出矩形?