问题 Global.asax的未处理异常


我正在通过电子邮件发送来自global.asax的未处理的异常详细信息。如何获取未处理异常的aspx文件或程序集文件的路径和/或文件名。

在我开发和测试时,此信息显示在异常的堆栈跟踪中。当我将global.asax部署到生产环境时,此信息不再显示在堆栈跟踪中。

有没有办法在Global.asax中构建我的MailMessage对象时获取此信息?

谢谢


3854
2018-02-24 23:58


起源



答案:


如果这是一个ASP.NET应用程序,标签建议它,你应该能够做这样的事情...... ctx.Request.Url.ToString()会给你发生错误的文件名。

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");
}

12
2018-02-26 00:24



真棒。谢谢! - Ronnie Overby
HttpContext.Current.Url为您提供当前的URL。但问题是要求组件的路径和/或文件名。 - RoadWarrior
@RoadWarrior:由于它是一个ASP.NET应用程序,因此URL很可能已经足够了。既然他接受了答案,我猜它满足了他的需要。 - RSolberg
另外要小心,错误不在于发送电子邮件...可能想要将整个内容包装在try / catch块中 - Sean


答案:


如果这是一个ASP.NET应用程序,标签建议它,你应该能够做这样的事情...... ctx.Request.Url.ToString()会给你发生错误的文件名。

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");
}

12
2018-02-26 00:24



真棒。谢谢! - Ronnie Overby
HttpContext.Current.Url为您提供当前的URL。但问题是要求组件的路径和/或文件名。 - RoadWarrior
@RoadWarrior:由于它是一个ASP.NET应用程序,因此URL很可能已经足够了。既然他接受了答案,我猜它满足了他的需要。 - RSolberg
另外要小心,错误不在于发送电子邮件...可能想要将整个内容包装在try / catch块中 - Sean


在Visual Studio中,您需要设置发布版本以生成调试符号。与调试版本不同,默认情况下不会设置此项。这将为您提供完整的异常堆栈跟踪。

即使这样,JIT编译器完成的优化(例如内联)也可能意味着您没有在堆栈跟踪中获得正确的行号。如果要确定行号,还可以将发布版本设置为“无优化”。但这可能意味着您的应用程序具有较低的性能和/或吞吐量(后者在Web应用程序中往往更为重要)。

编辑:您可以通过转到“解决方案资源管理器”窗口,右键单击项目并选择“属性”菜单项来找到“生成调试符号”设置。然后转到Configuration Properties> Build> Generate Debugging Information并设置为true或false。 “优化代码”设置位于同一窗口中。


0
2018-02-25 00:05



这是怎么做到的? - Ronnie Overby