application_Error中完成的会话更改在重定向后回滚

时间:2012-09-21 17:27:41

标签: c# asp.net

我有一个asp.net应用程序,我正在尝试使用Application_Error处理自定义异常。它工作得很好但我有新的要求在Session对象(或任何可以维护状态的对象)中设置错误数据并重定向到Error.aspx页面。我只是在阅读后删除错误消息。

所以,无论我在Application_error中添加到会话对象(或者我是否更改了以前存在的值)以及何时调用Redirect。在error.aspx中,我没有看到任何值,就像Session在Application_error中处于只读模式一样。

我试着打电话     session.IsReadOnly 看看它是否只读。但它返回false !!

5 个答案:

答案 0 :(得分:1)

检查一下,问题在于重定向呼叫。

Don't redirect after setting a Session variable (or do it right)

答案 1 :(得分: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];

答案 2 :(得分: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 页面中写下sesion对象中添加的错误消息

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

}

答案 3 :(得分:1)

我自己刚刚遇到这个问题,经过几个小时的捣乱,设法解决了这个问题。问题是Application_Error()在执行某些“清理”例程后需要停止会话后清除会话。

我找到的解决方案如下:

  1. 调用Server.ClearError(); - 这会清除应用程序中的最后一个错误并停止“清理”,从而保留会话。

  2. (不受欢迎的imho)副作用是它不再执行自动重定向到错误页面,因此您需要明确调用Response.Redirect("~/error.aspx");

  3. 所以,像这样:

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

    如果您不想对网址进行硬编码,可以直接从defaultRedirect中的customerrors部分抓取web.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);
    }
    

答案 4 :(得分:0)

问题可能是在您的应用程序中引发异常时可能未触发AcquireRequestState事件,您只能在触发此特定事件后才能设置会话值,因为这是应用程序状态已设置