1

我想在开发期间或在服务器本地提供有用信息时显示 YSOD,但在其他情况下显示半通用页面。我知道我可以在 web.config 中设置defaultRedirect应用程序的<customErrors>配置标签的属性,但我宁愿做一些处理来生成一个信息稍微好一点的页面。

我所有的控制器都继承自一个中央 BaseController 类,我在该类中重写了 OnException(基本上像这样):

protected override void OnException(ExceptionContext filterContext) {
    //if something really bad happened and we get inside this if, 
    //just let the YSOD appear because there isn't anything we can do
    if (filterContext == null)
        return; 

    LogException(filterContext.Exception);

    //insert answer for question here:
    if (FigureOutIfDetailedYsodWouldBeDisplayed(filterContext)) 
        return;

    //what to actually do for end users
    filterContext.ExceptionHandled = true;
    filterContext.Result = View("ErrorPage", GetErrorModel(filterContext));
}

我应该如何实现FigureOutIfDetailedYsodWouldBeDisplayed(答案不必是代码,指向正确方向的指针就可以了)?我当前的实现检查原始 url 是否存在“//localhost”,但是这个解决方案感觉很笨拙并且不能一直工作(例如,如果开发人员有一个主机条目来输入除 localhost 之外的其他内容:我们的要求应用程序曾经有)。

4

2 回答 2

2

您知道您还可以为每个 HTTP 错误代码添加自定义错误页面吗?那么你真的需要这个自定义错误处理代码吗?

  <customErrors mode="RemoteOnly" defaultRedirect="Error/Default">
    <error statusCode="401" redirect="Error/AccessDenied" />
    <error statusCode="404" redirect="Error/NotFound" />
  </customErrors>

此外,除非您有真正的特殊需求,否则我建议您不要自己编写此异常日志记录代码。帮自己一个忙,看看ELMAH。严重地。[免责声明:我不参与这个项目,只是一个非常高兴的用户]

所需要的只是(字面意思!)web.config 中的几行,在 bin 文件夹中放置一个 dll,以及(如果你想登录到数据库)一个 .sql 脚本。

项目页面

“ELMAH(错误记录模块和处理程序)是一个应用程序范围的错误记录工具,它是完全可插拔的。它可以动态添加到正在运行的 ASP.NET Web 应用程序,甚至是一台机器上的所有 ASP.NET Web 应用程序,无需任何需要重新编译或重新部署。

将 ELMAH 放入正在运行的 Web 应用程序并进行适当配置后,您无需更改任何一行代码即可获得以下功能:

  • 记录几乎所有未处理的异常。
  • 用于远程查看重新编码异常的整个日志的网页。
  • 用于远程查看任何记录的异常的完整详细信息的网页。
  • 在许多情况下,您可以查看 ASP.NET 生成的原始黄屏死机 - 对于给定的异常,即使关闭 customErrors 模式也是如此。
  • 每个错误发生时的电子邮件通知。”
于 2010-02-08T20:39:27.003 回答
0

如果您实际上使用 Dev 环境的 Debug 设置和生产环境的 Release 进行构建,您总是可以这样做

#if DEBUG
    //Show YSOD
#else
    //Show friendly error page
#endif
于 2010-02-08T20:09:57.027 回答