asp.net mvc 3 handleerror全局过滤器始终显示IIS状态500页

时间:2011-01-30 11:51:55

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

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

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

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

我也启用了CustomErrors(如果我设置defaultRedirect =“Error”并不重要,我认为这是在文档中因为旧版本的mvc需要):

<customErrors mode="On" />

尝试浏览页面直到出现错误,无论是从localhost还是使用主机名,在开发服务器或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 Application”模板,并且只是在该项目中启用customErrors,那么HandleError过滤器开始正常工作,但是使用空的MVC3模板没有。


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

6 个答案:

答案 0 :(得分:18)

要解决此问题,您需要做的就是编辑Error.cshtml页面并确保已正确设置Layout属性。在Empty MVC 3 Application中,它设置为NULL,这会导致HTTP 500内部服务器错误。

我通过简单地添加:

来解决这个问题

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

答案 1 :(得分:8)

我遇到了同样的问题。我找到了这篇文章: 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;
    }
}

答案 2 :(得分:6)

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

我尝试过其他浏览器并且工作正常: Chrome vs IE 9 Beta

我现在不能取消的是为什么“互联网应用”模板正在运作。

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

答案 3 :(得分:4)

发现问题 - 错误页面 - 确保放置一些虚拟内容 - 使内容大小至少为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>

答案 4 :(得分:1)

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

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

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

    <customErrors mode="On">
    </customErrors>
    
  5. 运行网站,系统会显示模板生成的~/Views/Shared/Error.cshtml视图。

答案 5 :(得分:0)

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