0

asp.net アプリケーションがあり、Application_Error を使用してカスタム例外を処理しようとしています。うまく機能しますが、Session オブジェクト (または状態を維持できる任意のオブジェクト) にエラー データを設定し、Error.aspx ページにリダイレクトするという新しい要件があります。エラーメッセージを読んだ後、エラーメッセージを削除しています。

そのため、Application_error でセッション オブジェクトに追加するもの (または以前に存在する値を変更した場合) と、リダイレクトを呼び出すときに何でもします。error.aspx には、Session が Application_error で読み取り専用モードであるかのように値が表示されません。

session.IsReadOnly を呼び出して、読み取り専用かどうかを確認してみました。しかし、それはfalseを返します!!

4

5 に答える 5

2

私は自分でこの問題に遭遇したばかりで、数時間いじり回した後、なんとか解決しました。問題は、Application_Error()停止する必要があるある種の「クリーンアップ」ルーチンの一部として実行した後にセッションをクリアすることです。

私が見つけた解決策は次のとおりです。

  1. 呼び出しServer.ClearError();- アプリケーションから最後のエラーをクリアし、「クリーンアップ」の実行を停止して、セッションを維持します。

  2. これの(望ましくない)副作用は、エラーページへの自動リダイレクトを実行しなくなることです。そのため、明示的に呼び出す必要がありますResponse.Redirect("~/error.aspx");

したがって、次のようなものです。

protected void Application_Error(object sender, EventArgs e)
{
    // Grab the last exception
    Exception ex = Server.GetLastError();

    // put it in session
    Session["Last_Exception"] = ex;

    // clear the last error to stop .net clearing session
    Server.ClearError();

    // The above stops the auto-redirect - so do a redirect!
    Response.Redirect("~/error.aspx");
}

URL をハードコーディングしたくない場合は、 のセクションdefaultRedirectから URL を直接取得できます。これにより、次のようになります。customerrorsweb.config

protected void Application_Error(object sender, EventArgs e)
{
    // Grab the last exception
    Exception ex = Server.GetLastError();

    // put it in session
    Session["Last_Exception"] = ex;

    // clear the last error to stop .net clearing session
    Server.ClearError();

    // The above stops the auto-redirect - so do a redirect using the default redirect from the customErrors section of the web.config!
    var customerrors = (CustomErrorsSection)WebConfigurationManager.OpenWebConfiguration("/").GetSection("system.web/customErrors");
    Response.Redirect(customerrors.DefaultRedirect);
}
于 2013-01-22T15:11:49.790 に答える
1

Global.asaxファイルにディレクティブを追加し、 System.Web名前空間をインポートします。

 <%@ Import Namespace="System.Web" %>


void Application_Error(object sender, EventArgs e) {

   string message = Server.GetLastError().Message;
   Session["error"] = message;
   Server.Transfer("Error.aspx");

}

セッション オブジェクトに追加されたエラー メッセージをError.aspxページに書き込みます。

 protected void Page_Load(object sender, EventArgs e){
    if (!this.IsPostBack)
        Response.Write(Session["error"].ToString());

}
于 2012-09-22T05:48:51.710 に答える
1

次のように、キャッシュとキーの適切な命名戦略を使用できます。

protected void Application_Error(object sender, EventArgs e)
    {
        HttpContext.Current.Cache["error:" + Session.SessionID] = Server.GetLastError();
        Response.Redirect("Error.aspx");
    }

Error.aspx ページでは、次のように読むことができます。

var error = Cache["error:" + Session.SessionID];
于 2012-09-21T19:30:54.073 に答える
1

これを確認してください。問題はリダイレクト呼び出しにあります。

セッション変数を設定した後にリダイレクトしない (または正しく行う)

于 2012-09-21T17:36:34.620 に答える
0

アプリケーションで例外が発生したときにAcquireRequestStateイベントが発生しなかった可能性があります。これはアプリケーションの状態が設定される段階であるため、この特定のイベントが発生した後にのみセッション値を設定できます。

于 2012-09-22T06:06:32.297 に答える