当前位置:  开发笔记 > 后端 > 正文

ASP.NET自定义错误页面 - Server.GetLastError()为null

如何解决《ASP.NET自定义错误页面-Server.GetLastError()为null》经验,为你挑选了6个好方法。

我为我的应用程序设置了自定义错误页面:


在Global.asax,Application_Error()中,以下代码用于获取异常详细信息:

  Exception ex = Server.GetLastError();
  if (ex != null)
    {
        if (ex.GetBaseException() != null)
            ex = ex.GetBaseException();
    }

当我到达我的错误页面(〜/ errors/GeneralError.aspx.cs)时,Server.GetLastError()为null

有没有什么办法可以在错误页面上获取异常详细信息,而不是在Global.asax.cs中?

Vista/IIS7上的ASP.NET 3.5



1> nailitdown..:

仔细查看我的web.config设置,这篇文章中的一条评论非常有帮助

在asp.net 3.5 sp1中有一个新参数redirectMode

所以我们可以修改customErrors添加这个参数:


ResponseRewrite模式允许我们加载«错误页面»而无需重定向浏览器,因此URL保持不变,对我来说重要的是,异常信息不会丢失.


这不适合我.异常信息丢失.我希望将它存储在Application_Error()的会话中,并将其拉回到我的错误页面的Page_Load()处理程序中.
这应该是所有文档中的标准.这太好了,我认为没有理由支持旧的行为了.只要状态代码正确,原始请求URL保持不变就没有问题(不进行浏览器重定向).事实上,根据HTTP更正确,因为响应代码与请求的URL相关,而不是共享的错误页面请求.感谢指针我错过了这个新功能!
因为它的旧答案添加我的评论来证明这个好的一个在redirectmode中的ResponseRewrite值在Asp.Net 4.5中有效

2> nailitdown..:

好的,我发现这篇文章:http: //msdn.microsoft.com/en-us/library/aa479319.aspx

有了这个非常简单的图表:

图http://i.msdn.microsoft.com/Aa479319.customerrors_01(en-us,MSDN.10).gif

本质上,为了获得那些异常细节,我需要将它们自己存储在Global.asax中,以便以后在我的自定义错误页面上进行检索.

似乎最好的方法是在Global.asax中完成大部分工作,自定义错误页面处理有用的内容而不是逻辑.



3> rlb.usa..:

NailItDown和Victor所说的组合.首选/最简单的方法是使用Global.Asax存储错误,然后重定向到自定义错误页面.

Global.asax:

    void Application_Error(object sender, EventArgs e) 
{
    // Code that runs when an unhandled error occurs
    Exception ex = Server.GetLastError();
    Application["TheException"] = ex; //store the error for later
    Server.ClearError(); //clear the error so we can continue onwards
    Response.Redirect("~/myErrorPage.aspx"); //direct user to error page
}

此外,您需要设置web.config:

  
    
    
  

最后,根据您存储在错误页面中的异常,执行您需要的任何操作:

protected void Page_Load(object sender, EventArgs e)
{

    // ... do stuff ...
    //we caught an exception in our Global.asax, do stuff with it.
    Exception caughtException = (Exception)Application["TheException"];
    //... do stuff ...
}


如果将其存储在应用程序中,那么系统的所有其他用户呢.不应该在会议中吗?
事实上,这是一个非常糟糕的方法,将其存储在Application ["TheException"]上
+1但要注意`Application []`是一个全局对象.从理论上讲,你可能会遇到竞争条件,其中第二页会覆盖错误.但是,由于`Session []`在错误条件下并不总是可用,我认为这是更好的选择.
此外,如果要为每个用户支持多个"选项卡",您可能希望在会话存储中为该异常提供唯一键,然后在重定向到错误页面时将该键包含为查询字符串参数.
只需在用于存储异常的密钥中添加新的GUID前缀,并将GUID作为参数传递给自定义错误页面.

4> 小智..:

尝试Server.Transfer("~/ErrorPage.aspx");Application_Error()global.asax.cs 的方法中使用类似的东西

然后从Page_Load()ErrorPage.aspx.cs中你可以做以下事情:Exception exception = Server.GetLastError().GetBaseException();

Server.Transfer() 似乎保持异常悬而未决.



5> 小智..:

虽然这里有几个好的答案,但我必须指出,在错误页面上显示系统异常消息并不是一个好习惯(这是我假设你想做的事情).您可能会无意中向恶意用户透露您不希望这样做的内容.例如,Sql Server异常消息非常详细,并且可以在发生错误时提供数据库的用户名,密码和架构信息.该信息不应显示给最终用户.


不回答问题。

6> 小智..:

这是我的解决方案。

在Global.aspx中:

void Application_Error(object sender, EventArgs e)
    {
        // Code that runs when an unhandled error occurs

        //direct user to error page 
        Server.Transfer("~/ErrorPages/Oops.aspx"); 
    }

在Oops.aspx中:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadError(Server.GetLastError()); 
    }

    protected void LoadError(Exception objError)
    {
        if (objError != null)
        {
            StringBuilder lasterror = new StringBuilder();

            if (objError.Message != null)
            {
                lasterror.AppendLine("Message:");
                lasterror.AppendLine(objError.Message);
                lasterror.AppendLine();
            }

            if (objError.InnerException != null)
            {
                lasterror.AppendLine("InnerException:");
                lasterror.AppendLine(objError.InnerException.ToString());
                lasterror.AppendLine();
            }

            if (objError.Source != null)
            {
                lasterror.AppendLine("Source:");
                lasterror.AppendLine(objError.Source);
                lasterror.AppendLine();
            }

            if (objError.StackTrace != null)
            {
                lasterror.AppendLine("StackTrace:");
                lasterror.AppendLine(objError.StackTrace);
                lasterror.AppendLine();
            }

            ViewState.Add("LastError", lasterror.ToString());
        }
    }

   protected void btnReportError_Click(object sender, EventArgs e)
    {
        SendEmail();
    }

    public void SendEmail()
    {
        try
        {
            MailMessage msg = new MailMessage("webteam", "webteam");
            StringBuilder body = new StringBuilder();

            body.AppendLine("An unexcepted error has occurred.");
            body.AppendLine();

            body.AppendLine(ViewState["LastError"].ToString());

            msg.Subject = "Error";
            msg.Body = body.ToString();
            msg.IsBodyHtml = false;

            SmtpClient smtp = new SmtpClient("exchangeserver");
            smtp.Send(msg);
        }

        catch (Exception ex)
        {
            lblException.Text = ex.Message;
        }
    }

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有