【问题标题】:Is there an implementation somewhere of the yellow screen of death?有没有实现黄屏死机的地方?
【发布时间】:2011-09-05 05:12:27
【问题描述】:

在 ASP.NET 中,当您处于 DEBUG 模式并且出现故障时,您会看到著名的黄屏死机。

它显示有一个Server Error in <Location> Application,提供描述、异常细节、源文件和堆栈跟踪。

我想扩展此错误页面以包含一些额外信息。

  • 是否有“开源”实现黄屏死机?
  • 有没有办法延长内置的黄屏死机?

【问题讨论】:

    标签: .net asp.net


    【解决方案1】:

    错误页面格式由System.Web.ErrorFormatter 及其子类完成,不幸的是它们是内部的。如果您喜欢使用HttpException.GetHtmlErrorMessage(),您可以获取 HTML 并对其进行修改。但我倾向于按照其他评论者的建议使用Server.GetLastError 并自己格式化。

    如果是这样 - 请确保您 HtmlEncode 输出错误消息以缓解 XSS 并确保您的生产站点不显示有关该错误的任何信息(因为这是 2010 年 ASP.NET padding oracle 解密攻击的攻击向量) .

    【讨论】:

    • 提出的HttpException解决方案的问题是似乎没有办法拉出HttpException,你只能拦截SqlException ...
    • 简单的new-ing 一个HttpException 将你的SqlException 作为InnerException 传递然后调用GetHtmlErrorMessage() 怎么样。
    • 试过了...没有设置格式化程序...只有选项似乎是 DIY 或 http 模块
    • 看起来(根据 Reflector)如果您使用 HttpUnhandledException(string message, Exception innerException) 新建子类 HttpUnhandledException,它会调用 SetFormatter...
    • true ...见samsaffron.com/archive/2011/09/08/… ...我接受这个
    【解决方案2】:

    此页面似乎包含您要查找的信息。

    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();
    }
    

    【讨论】:

    • 理论上这是可行的,但是在 mvc3 中,当它遇到 Application_Error 时,你有一个 SqlException ...而不是一个 HttpException
    • 是你的编辑,是的......我已经做到了......只是我没有和 HttpException 所以除非我手动编码,否则无法呈现黄色屏幕的 html 跨度>
    • 查看源代码并提取会为您省去麻烦。然后设置一个漂亮的 razor 模板,它会呈现异常以及你想要的任何额外数据?
    • 是的......我猜......它是一个 PITA......我认为有更简单的方法
    • @Sam:是的,似乎 MS 在框架中的许多地方都认为可扩展性更好......
    【解决方案3】:

    如果您使用自定义错误页面,我相信您可以使用HttpContext.Current.Server.GetLastError(); 获得最后一个错误我不确定是否有任何自定义页面。但是 YSOD 的内容应该可以从请求的上下文中获得。

    【讨论】:

      【解决方案4】:

      是的。

      请看这里:
      http://www.oschina.net/code/explore/mono-2.8.1/mcs/class/System.Web/System.Web/HttpException.cs

      它来自mono(.NET for Linux)的源代码,版本

      【讨论】:

        猜你喜欢
        • 2011-01-11
        • 2011-07-23
        • 1970-01-01
        • 2014-03-12
        • 2011-06-24
        • 1970-01-01
        • 2011-01-21
        • 2012-10-27
        • 2010-09-06
        相关资源
        最近更新 更多