我自己也遇到过这个问题,经过几个小时的折腾,设法解决了这个问题。问题是Application_Error()
在作为某种“清理”例程的一部分执行后会清除会话,您需要停止该例程。
我找到的解决方案如下:
调用Server.ClearError();
- 这会清除应用程序的最后一个错误并停止进行“清理”,从而保留会话。
这样做的(不想要的恕我直言)副作用是它不再执行自动重定向到错误页面,因此您需要显式调用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);
}