将上一个错误传递给自定义错误重定向的最佳方法?

Dar*_*ell 5 asp.net caching custom-errors getlasterror

想知道你对这个解决方案的看法,如果这是将错误信息传递给自定义页面的正确方法吗?

在web.config中:

    <customErrors mode="On" defaultRedirect="~/Error.aspx"></customErrors>
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

在我的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:我不想从Global.asax做一个Server.Transfer因为..我不知道.对我来说似乎很笨拙.希望能够将customErrors更改为RemoteOnly.所以必须在某处保存最后一个异常,但不能是Session,所以保存到Cache但是有一些额外的数据(时间和SessionID),因为Cache是​​全局的,并且希望确保不向某人显示错误的错误.


我有点改变了我的代码.现在它只是:

void Application_Error(object sender, EventArgs e)
{
    HttpContext.Current.Cache["LastError"] = Server.GetLastError().GetBaseException();
    Server.ClearError();
}
Run Code Online (Sandbox Code Playgroud)

...和...

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

注意SessionID不存在,如果匿名用户和ex.Data.Add已经存在的密钥会导致错误让我意识到调用ClearError很重要

Ste*_*ham 7

我认为这是一个体面的方式.这不是我这样做的方式,但我的代码太冗长而无法发布(在VB.NET中).

我要改变的一件事是错误页面本身.不要显示错误,请考虑将文本框添加到错误页面作为可选字段,用户可以在其中输入其电子邮件地址并单击按钮将错误报告发送给您.然后,当您收到错误报告时,您可以查看问题并回复它们.这是一种更加用户友好的方式,对于我已经完成此操作的网站来说,它的效果非常好.

沿着这些方向,您可能还希望收集表单数据,会话数据和其他任何有价值的内容,并将其放入错误报告中.这可以使诊断问题更容易.