我为我的应用程序设置了自定义错误页面:
在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
仔细查看我的web.config设置,这篇文章中的一条评论非常有帮助
在asp.net 3.5 sp1中有一个新参数redirectMode
所以我们可以修改customErrors
添加这个参数:
该ResponseRewrite
模式允许我们加载«错误页面»而无需重定向浏览器,因此URL保持不变,对我来说重要的是,异常信息不会丢失.
好的,我发现这篇文章: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中完成大部分工作,自定义错误页面处理有用的内容而不是逻辑.
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 ... }
尝试Server.Transfer("~/ErrorPage.aspx");
在Application_Error()
global.asax.cs 的方法中使用类似的东西
然后从Page_Load()
ErrorPage.aspx.cs中你可以做以下事情:Exception exception = Server.GetLastError().GetBaseException();
Server.Transfer()
似乎保持异常悬而未决.
虽然这里有几个好的答案,但我必须指出,在错误页面上显示系统异常消息并不是一个好习惯(这是我假设你想做的事情).您可能会无意中向恶意用户透露您不希望这样做的内容.例如,Sql Server异常消息非常详细,并且可以在发生错误时提供数据库的用户名,密码和架构信息.该信息不应显示给最终用户.
这是我的解决方案。
在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; } }