错误页面不呈现

时间:2014-03-13 16:34:38

标签: asp.net routing global-asax custom-error-pages server.transfer

所以我将global.asax Application_Error()事件设置为处理错误,然后将Server.Transfer()执行到自定义错误页面。当抛出异常时,我可以通过Application_Error事件观察代码步骤,然后进入我的自定义错误页面的Page_Load()事件并遍历所有代码而没有错误;但是我的错误页面永远不会结束渲染。它只停留在我所在的页面上,看起来什么也没发生。为什么我的错误页面没有呈现?下面是我的Application_Error事件的代码以及错误页面的Page_Load事件。

    protected void Application_Error(object sender, EventArgs e)
    {
        Exception ex = HttpContext.Current.Server.GetLastError();

        if (ex is HttpUnhandledException && ex.InnerException != null)
            ex = ex.InnerException;

        if (ex != null)
        {
            Guid errorID = Guid.NewGuid();
            log.Error(string.Format("=====WEBSITE ERROR===== Error ID: {0}", errorID), ex);
            Server.Transfer(string.Format("~/Pages/error.aspx?id={0}", errorID));
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        string errorID = Request.QueryString["id"];
        Exception ex = HttpContext.Current.Server.GetLastError();
        if (ex is HttpUnhandledException && ex.InnerException != null)
            ex = ex.InnerException;

        lblErrorID.Text = errorID;

        if (ex != null)
        {
            lblErrorMessage.Text = ex.Message;
            lblStackTrace.Text = ex.StackTrace.Replace("\n", "<br/>");
            plcStackTrace.Visible = bool.Parse(System.Configuration.ConfigurationManager.AppSettings["displayStackTrace"]);
        }
        else
            plcErrorData.Visible = false;
    }

值得注意的是,我通过Application_Start事件和RouteConfig类使用自定义路由。这不应该影响这个,因为我在另一个网站上做同样的事情,它就像一个魅力。

1 个答案:

答案 0 :(得分:0)

处理异常后,您必须清除它。只需调用Server.ClearError()

即可
protected void Page_Load(object sender, EventArgs e)
{
    string errorID = Request.QueryString["id"];
    Exception ex = HttpContext.Current.Server.GetLastError();
    if (ex is HttpUnhandledException && ex.InnerException != null)
        ex = ex.InnerException;

     //This works  
     Server.ClearError();

    lblErrorID.Text = errorID;

    if (ex != null)
    {
        lblErrorMessage.Text = ex.Message;
        lblStackTrace.Text = ex.StackTrace.Replace("\n", "<br/>");
        plcStackTrace.Visible = bool.Parse(System.Configuration.ConfigurationManager.AppSettings["displayStackTrace"]);
    }
    else
        plcErrorData.Visible = false;
}