我已经尝试了所有方法,甚至卸载了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 View 已在“共享”中创建。这是错误 View 代码:
@model System.Web.Mvc.HandleErrorInfo

@{
    ViewBag.Title = "Oooops";
}

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

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

我想澄清的是,确实可以在调试时看到错误 View 正在处理中,但是浏览器始终显示“错误500”页面。

最佳答案

我遇到了同样的问题。我找到了这篇文章: 500 Internal Server Error in ASP.NET MVC并尝试取消选中“Friendly Http Errors”,并且我的HandleErrors属性在IE 8中按预期方式开始正常工作,并且选中了IE 7兼容模式(默认情况下开始像在Chrome中那样开始工作)。我认为这不是已部署应用程序的有效解决方案,但是也许可以通过一种方法扩展HandleError属性,以便将其重定向到“Error” Controller ,而不仅仅是默认的Error View 。

更新:This post显示,当返回HTTP Status 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;
    }
}

10-08 17:46