1

我是 ASP.NET 的新手,我有一个非常基本的站点,我只想获取所有应用程序错误并将它们通过电子邮件发送给我,同时为用户提供一个错误页面。我阅读了很多关于这个主题的内容,似乎有很多信息。以下是我想出的,但我在保持会话中的异常时遇到问题,因此我可以通过电子邮件将其发送给我。

我不断NullReferenceException was unhandled by user code从 Error.aspx.cs 文件中获得关于 ex.Message 的信息。

有什么想法吗?

Global.asax.cs-

void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();

    HttpContext.Current.Response.Redirect("~/Error.aspx");
}

错误.aspx.cs-

public partial class Error : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Exception ex = (Exception)Session["Exception"];
            this.SendEmail(ex);
            Session.Remove("Exception");
        }
    }

    private void SendEmail(Exception ex)
    {
        string body = "An exception occured at "
                    + DateTime.Now.ToLongTimeString()
                    + " on " + DateTime.Now.ToLongDateString()
                    + "<br />" + ex.Message; //ERROR HERE
        MailMessage msg = new MailMessage("from@email.com", "to@email.com");
        msg.Subject = "Exception in Portal Website";
        msg.Body = body;
        msg.IsBodyHtml = true;
        SmtpClient client = new SmtpClient("localhost");
        client.Send(msg);
    }
}
4

4 回答 4

3

你的问题是你从来没有设置Session["Exception"],所以在你的Error.aspx,Exception ex总是会为空......然后做ex.Message会抛出NullReferenceException. 即使您解决了该问题并进行了适当的设置Session["Exception"],您所做的也并不理想。

  1. 您可以从该Application_Error功能发送电子邮件。

  2. 您的Response.RedirectMSDN 条目)将导致另一个异常(ThreadAbortException)

  3. 您应该考虑实施ELMAH。它很容易实现并且可以做你想做的一切。

但是,如果您只想修复代码,只需将发送电子邮件逻辑移动到 Application_Error,然后您就不必担心Session.

于 2013-02-14T21:21:58.900 回答
1

我在类似实例中所做的是抛出所有异常,然后在您的 global.asax 中使用 Application_Error 方法执行您需要处理错误消息的任何工作。

  void Application_Error(object sender, EventArgs e) 
    {
        // Code that runs when an unhandled error occurs
        string exception;
            Exception ex = Server.GetLastError();
            if (ex.InnerException != null)
            {
                Exception innerException = ex.InnerException;
                exception = ex.InnerException.Message;
            }
            else
            {
                exception = ex.Message;
            }

        //Send email here       

            //redirect to error page


    }
于 2013-02-14T21:19:22.207 回答
0

我没有看到您将异常对象推送到会话,为什么不将 SendEmail 方法移动到 global.ascx 和 SendEmail 然后将用户重定向到错误页面。有像ELMAH这样的第三方插件,可以通过简单的配置为您轻松完成所有这些工作。

于 2013-02-14T21:19:09.357 回答
0

我也有类似的情况。我要去看看 ELMAH,但我的项目对开源项目有很大的限制,你可能会。糟透了成为我!

在这种情况下,我建议为您可以直接从 Global.asax 调用的消息创建一个日志记录函数。就像是:

 void Application_Error(object sender, EventArgs e)
 {
      Exception ex = Server.GetLastError();
      LogException(ex);
      HttpContext.Current.Response.Redirect("~/Error.aspx");
 }

 //Somewhere Else
 void LogException(Exception ex)
 {
      WriteExceptionToEndOfTextFile(ex);
      SendEmail();
 }

这样,如果有人决定要抑制我们的异常,他们仍然可以正确处理异常。

于 2013-02-14T21:52:33.413 回答