6

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

4

6 回答 6

9

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

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

将 ELMAH 放入正在运行的 Web 应用程序并进行适当配置后,您无需更改任何一行代码即可获得以下功能:

  • 记录几乎所有未处理的异常。
  • 用于远程查看重新编码异常的整个日志的网页。
  • 用于远程查看任何记录的异常的完整详细信息的网页。
  • 在许多情况下,即使关闭了 customErrors 模式,您也可以查看 ASP.NET 为给定异常生成的原始黄屏死机。
  • 每个错误发生时的电子邮件通知。
  • 来自日志的最后 15 个错误的 RSS 提要。
于 2009-05-18T16:47:36.140 回答
8

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

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

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

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

于 2011-10-20T12:53:28.093 回答
3

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

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

于 2009-05-18T16:47:01.540 回答
2

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

于 2009-05-18T16:46:22.507 回答
2

我会说一般来说,您不希望用户体验 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");
}
于 2009-05-18T16:46:43.380 回答
1

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

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

于 2009-05-18T16:47:55.453 回答