0

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

因此,无论我在 Application_error 中以及在调用 Redirect 时添加到会话对象(或者如果我更改了先前存在的值)中的任何内容。在error.aspx 中,我看不到任何值,就好像Session 在Application_error 中处于只读模式一样。

我尝试通过调用 session.IsReadOnly 来查看它是否是只读的。但它返回错误!

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直接从 中的customerrors部分获取 URL 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);
}
于 2013-01-22T15:11:49.790 回答
1

Add a directive to the Global.asax file, Imports the System.Web Namespace

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


void Application_Error(object sender, EventArgs e) {

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

}

Write the error message added in the sesion object in the Error.aspx page

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

}
于 2012-09-22T05:48:51.710 回答
1

检查这个,问题出在重定向调用上。

设置 Session 变量后不要重定向(或做对)

于 2012-09-21T17:36:34.620 回答
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 回答
0

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

于 2012-09-22T06:06:32.297 回答