【问题标题】:asp.net mvc 3 handleerror global filter always shows IIS status 500 pageasp.net mvc 3 handleerror 全局过滤器始终显示 IIS 状态 500 页面
【发布时间】:2011-06-18 01:58:05
【问题描述】:

我已经尝试了所有方法,甚至卸载了 asp.net mvc3,但我无法让 HandleError 全局过滤器正常工作。

我已经在 Global.asax 中设置了 HandleError 过滤器:

 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
 {
     filters.Add(new HandleErrorAttribute());
 }

我还启用了 CustomErrors(我是否设置 defaultRedirect="Error" 都没有关系,我认为这在文档中,因为旧版本的 mvc 需要):

<customErrors mode="On" />

尝试浏览页面直到出现错误,无论您是从本地主机还是使用主机名,在开发服务器或 IIS 7.5 内,它总是重定向到标准状态 500 页面,而不是我的自定义 Error.cshtml我在 Shared 中创建的视图。这是错误视图代码:

@model System.Web.Mvc.HandleErrorInfo

@{
    ViewBag.Title = "Oooops";
}

<h2>Ooops Something really bad happened!</h2>

我还注意到,如果我创建一个新的 ASP.NET MVC3 项目,然后选择“Internet 应用程序”模板,并在该项目中启用 customErrors,则 HandleError 过滤器开始正常工作,但是使用空的 MVC3 模板没有。


我想澄清一下,我确实可以在调试时看到正在处理的错误视图,但是浏览器总是显示错误 500 页面。

【问题讨论】:

  • 我不这么认为,因为我已经说过它在开发服务器上也不起作用

标签: c# asp.net asp.net-mvc asp.net-mvc-3 razor


【解决方案1】:

以下是我使用过且对我有用的步骤:

  1. 使用 Empty 模板创建一个新的 ASP.NET MVC 3 项目
  2. 添加一个名为 HomeController 的新控制器,其内容如下(您不需要任何视图 => 无论如何我们都会抛出异常):

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            throw new Exception("error");
        }
    }
    
  3. 通过添加以下部分打开 web.config 上的自定义错误:

    <customErrors mode="On">
    </customErrors>
    
  4. 运行站点,将显示由模板生成的~/Views/Shared/Error.cshtml 视图。

【讨论】:

  • 我回家后会再试一次,但这些是我遵循的步骤
  • 我已经完全复制了这些步骤,我只得到了http状态500页面
  • @iCe,你是在 Cassini 上运行这个吗?还要检查您机器的事件日志。也许您遇到了另一个问题。
  • 如前所述,在“Cassini”内置的 asp.net 开发服务器中不工作,也不在 IIS 内工作。此外,事件日志中没有记录任何奇怪的事件
  • @iCE,您的设置一定有其他问题,不幸的是我无法说出是什么,因为我无法重现它。对我来说,它使用 ASP.NET MVC 3 RTM 在 Cassini 和 IIS 中按预期工作。
【解决方案2】:

这很好笑,终于找到答案了,这台机器安装了 Internet Explorer 9 测试版,并且在处理 HandleError 属性设置的状态 500 时显示错误视图之前的行为有所不同。

我已经尝试过其他浏览器并且工作正常:

我现在无法理解的是为什么“Internet Appication”模板可以正常工作。

有人知道我可以在哪里发布错误吗?它应该去 asp.net mvc 团队还是 IE 9 团队?我如何联系他们?

【讨论】:

  • 哇。很好的发现,如果我没有找到你的自我答案,我不知道我会搜索多久:D
【解决方案3】:

我遇到了同样的问题。我找到了这篇文章: 500 Internal Server Error in ASP.NET MVC 并尝试取消选中“友好的 Http 错误”,并且我的 HandleErrors 属性在 IE 8 中开始按预期工作,并在 IE 7 兼容模式下进行了检查(并且默认情况下开始像在 Chrome 中那样工作)。我不认为这对于已部署的应用程序来说是一个有效的解决方案,但也许有一种方法可以扩展 HandleError 属性,以便它重定向到“错误”控制器,而不仅仅是默认的错误视图。

更新:This post 表明当返回 HTTP 状态 500 时,IE 会笨拙地处理它。解决它的一种方法是将状态设置为 200,然后一切似乎都可以正常工作(即使在 IE 中)。

public class CustomHandleErrorAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {    
        base.OnException(filterContext);

        //https://stackoverflow.com/questions/5137627/mvc-handleerror-returns-error-500-and-view-error-page
        //https://stackoverflow.com/questions/183316/asp-net-mvc-handleerror
        filterContext.HttpContext.Response.StatusCode = 200;
    }
}

【讨论】:

    【解决方案4】:

    我想我找到了解决这个问题的方法。将您的 Error.cshtml 和 _Layout.cshtml 替换为从 Internet 或 Intranet 模板生成的。

    【讨论】:

      【解决方案5】:

      发现问题 - 错误页面 - 确保放置一些虚拟内容 - 使内容大小至少为 1KB。

      这里是Error.cshtml的内容

      <!DOCTYPE html>
      <html>
      <head>
          <title>Error</title>
      </head>
      <body>
          <h2>
              Sorry, an error occurred while processing your request. @DateTime.Now
          </h2>
          <div>
          ..........................................................................
          ..........................................................................
          ..........................................................................
          ..........................................................................
          ..........................................................................
          ..........................................................................
          ..........................................................................
          ..........................................................................
          ..........................................................................
          ..........................................................................
          ..........................................................................
          </div>
      </body>
      </html>
      

      【讨论】:

      • @Bavarious 6 年后,我遇到了这个问题,我的 Error.cshtml 的内容已经是 1KB,但我仍然无法解决这个非常烦人的问题。
      【解决方案6】:

      要解决此问题,您只需编辑 Error.cshtml 页面并确保您已正确设置 Layout 属性。在空的 MVC 3 应用程序中,这被设置为 NULL,这会导致 HTTP 500 内部服务器错误。

      我通过简单地添加解决了这个问题:

      @{ Layout = "~/Views/Shared/_Layout.cshtml"; }

      【讨论】:

      • 这确实也解决了我的问题。空的 Internet 应用程序 -> 未定义布局。好地方!
      • 我多年来一直在努力解决这个问题,尽管事实上我有一个 _ViewStart.cshtml 定义默认值,但设置布局让这一切对我来说都很完美。非常感谢!
      • 是的,这立即解决了我的问题。很棒的工作@Paul Thomas!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 2011-07-05
      相关资源
      最近更新 更多