想知道您对此解决方案的看法,如果这是将错误消息传递到自定义页面的正确方法?
在 web.config 中:
<customErrors mode="On" defaultRedirect="~/Error.aspx"></customErrors>
在 Global.asax 中:
<script RunAt="server">
void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
if (ex != null && Session != null)
{
ex.Data.Add("ErrorTime", DateTime.Now);
ex.Data.Add("ErrorSession", Session.SessionID);
HttpContext.Current.Cache["LastError"] = ex;
}
}
</script>
在我的 Error.aspx.cs 中:
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack) return;
if (HttpContext.Current.Cache["LastError"] != null)
{
Exception ex = (Exception)HttpContext.Current.Cache["LastError"];
if (ex.Data["ErrorTime"] != null && ex.Data["ErrorSession"] != null)
if ((DateTime)ex.Data["ErrorTime"] > DateTime.Now.AddSeconds(-30d) && ex.Data["ErrorSession"].ToString() == Session.SessionID)
Label1.Text = ex.InnerException.Message;
}
}
问题:我不想从 Global.asax 做一个 Server.Transfer 因为..我不知道。对我来说似乎很笨拙。希望能够将 customErrors 更改为 RemoteOnly。所以必须在某处保存最后一个异常,但不能是会话,所以保存到缓存但有一些额外的数据(时间和 SessionID),因为缓存是全局的,并且希望确保不会向某人显示错误的错误。
我稍微改变了我的代码。现在只是:
void Application_Error(object sender, EventArgs e)
{
HttpContext.Current.Cache["LastError"] = Server.GetLastError().GetBaseException();
Server.ClearError();
}
...和...
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack) return;
if (HttpContext.Current.Cache["LastError"] != null)
{
Exception ex = (Exception)HttpContext.Current.Cache["LastError"];
if (ex != null)
Label1.Text = ex.Message;
}
}
注意 SessionID 如果匿名用户不存在,ex.Data.Add 一个已经存在的键会导致错误,让我意识到调用 ClearError 很重要