1

私はASP.NETを初めて使用し、ユーザーにエラーページを表示しながら、すべてのアプリケーションエラーを取得して電子メールで送信したいという非常に基本的なサイトを持っています。私はこのテーマについてたくさん読んでいて、たくさんの情報があるようです。以下は私が思いついたものですが、セッションで例外を維持するのに問題があるので、それを私に電子メールで送信できます。

NullReferenceException was unhandled by user codeError.aspx.csファイルからex.Messageを取得し続けます。

何かご意見は?

Global.asax.cs-

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

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

Error.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.aspxException exex.MessageNullReferenceExceptionSession["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

私も同じような状況に陥っています。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 に答える
0

例外オブジェクトをセッションにプッシュしていません。SendEmail メソッドを global.ascx に移動してから、SendEmail をエラー ページにリダイレクトしてみてください。シンプルな構成でこれらすべてを簡単に実行できるELMAHなどのサードパーティのプラグインがあります。

于 2013-02-14T21:19:09.357 に答える