【发布时间】:2011-09-05 05:12:27
【问题描述】:
在 ASP.NET 中,当您处于 DEBUG 模式并且出现故障时,您会看到著名的黄屏死机。
它显示有一个Server Error in <Location> Application,提供描述、异常细节、源文件和堆栈跟踪。
我想扩展此错误页面以包含一些额外信息。
- 是否有“开源”实现黄屏死机?
- 有没有办法延长内置的黄屏死机?
【问题讨论】:
在 ASP.NET 中,当您处于 DEBUG 模式并且出现故障时,您会看到著名的黄屏死机。
它显示有一个Server Error in <Location> Application,提供描述、异常细节、源文件和堆栈跟踪。
我想扩展此错误页面以包含一些额外信息。
【问题讨论】:
错误页面格式由System.Web.ErrorFormatter 及其子类完成,不幸的是它们是内部的。如果您喜欢使用HttpException.GetHtmlErrorMessage(),您可以获取 HTML 并对其进行修改。但我倾向于按照其他评论者的建议使用Server.GetLastError 并自己格式化。
如果是这样 - 请确保您 HtmlEncode 输出错误消息以缓解 XSS 并确保您的生产站点不显示有关该错误的任何信息(因为这是 2010 年 ASP.NET padding oracle 解密攻击的攻击向量) .
【讨论】:
new-ing 一个HttpException 将你的SqlException 作为InnerException 传递然后调用GetHtmlErrorMessage() 怎么样。
HttpUnhandledException(string message, Exception innerException) 新建子类 HttpUnhandledException,它会调用 SetFormatter...
此页面似乎包含您要查找的信息。
http://www.asp.net/hosting/tutorials/processing-unhandled-exceptions-cs
基本上,当异常冒泡到运行时时,它会被包裹在 System.Web.HttpException 中(这是错误的。至少我在 MVC 3 中没有看到这种行为)。
我认为您可以扩展该类并覆盖 GetHtmlErrorMessage 以返回您想要的任何额外数据。
更新:好吧,通过一些实验,我似乎错了。但是有一个解决方法...
您可以以您选择的任何方式从异常中写入信息,然后清除错误,您将得到您想要返回的信息。
这样的……
protected void Application_Error(object sender, EventArgs e)
{
var context = HttpContext.Current;
var error = context.Server.GetLastError();
context.Response.Write(error.Message);
context.Response.Write("<br /><br />");
context.Response.Write(error.StackTrace);
context.Response.Write("<br /><br />");
context.Response.Write("Hello World");
context.Server.ClearError();
}
【讨论】:
如果您使用自定义错误页面,我相信您可以使用HttpContext.Current.Server.GetLastError(); 获得最后一个错误我不确定是否有任何自定义页面。但是 YSOD 的内容应该可以从请求的上下文中获得。
【讨论】:
是的。
请看这里:
http://www.oschina.net/code/explore/mono-2.8.1/mcs/class/System.Web/System.Web/HttpException.cs
它来自mono(.NET for Linux)的源代码,版本
【讨论】: