我有一个asp.net应用程序,我正在尝试使用Application_Error处理自定义异常。它工作得很好但我有新的要求在Session对象(或任何可以维护状态的对象)中设置错误数据并重定向到Error.aspx页面。我只是在阅读后删除错误消息。
所以,无论我在Application_error中添加到会话对象(或者我是否更改了以前存在的值)以及何时调用Redirect。在error.aspx中,我没有看到任何值,就像Session在Application_error中处于只读模式一样。
我试着打电话 session.IsReadOnly 看看它是否只读。但它返回false !!
答案 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()
在执行某些“清理”例程后需要停止会话后清除会话。
我找到的解决方案如下:
调用Server.ClearError();
- 这会清除应用程序中的最后一个错误并停止“清理”,从而保留会话。
(不受欢迎的imho)副作用是它不再执行自动重定向到错误页面,因此您需要明确调用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");
}
如果您不想对网址进行硬编码,可以直接从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事件,您只能在触发此特定事件后才能设置会话值,因为这是应用程序状态已设置