ASP.NET MVC HandleError无法正常工作(customErrors设置为“On”)

时间:2009-06-15 22:55:03

标签: asp.net-mvc handleerror

我相信我已经设置了我们的MVC应用程序以正确使用[HandleError]。这是我的控制者:

[HandleError]
public class SupportController : BaseController {

    public ActionResult Toss() {
        throw new Exception("uh oh");
    }
    // snip
}

customErrors中的web.config标记设置为“开启”:

<customErrors mode="On"></customErrors>

然而,我仍然在例外情况下获得黄色死亡屏幕。在我的Toss()操作中设置断点会显示HttpContext.IsCustomErrorEnabled 设置为true。

我们没有对View Engine做任何事情,BaseController也没有搞乱任何东西(和其他没有扩展它的控制器有相同的问题)。

我正在使用Windows XP开发,并且在将应用程序部署到服务器2003框(IIS 6)时遇到同样的问题。

我认为error.aspx页面上没有例外:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>

<asp:Content ID="errorContent" ContentPlaceHolderID="MainContent" runat="server">
    <h2>
        Sorry, an error occurred while processing your request.
    </h2>
</asp:Content>

可能有一点不同的是,这个应用程序是在MVC Beta是最新版本时创建的,并且在它们发布时升级到RC然后升级到RTM。可能会有一些从那里遗留下来的怪异设置?

我可以在其他应用上使用它,所以我有点沮丧。

7 个答案:

答案 0 :(得分:19)

如果在处理错误页面时出现问题,则会发生这种情况..如果您调试应用程序,在初始异常之后,您将遇到另一个问题(错误页面中的异常)..我发生了这种情况并且我的原因是因为我有一个强类型的母版页,错误页面正在使用这个母版页,并且因为母版页与实际页面共享相同的模型,所以母版页获得了HandlerErrorInfo模型,而不是键入的模型我预期..

我个人认为这是asp.net mvc中的一个糟糕的设计(以及其余部分),但你可以通过不使用相同的母版页来轻松实现这一点(你甚至可以在那里做母版继承有一个继承的强类型母版页,它纯粹从无类型的图层继承了这个图层。

否则,这是错误视图中发生的某种异常..(最有可能)。

答案 1 :(得分:3)

如果您使用的是IE9,还有另一个问题。似乎IE9隐藏了错误页面,如果它小于1Kb,如下所示:

asp-net-mvc-3-handleerror-global-filter-always-shows-iis-status-500-page

确保内容正文长度超过1Kb。 尝试在错误页面的末尾添加:

@(new String('',1000))

答案 2 :(得分:2)

此问题的另一个原因可能是,

在模板MVC应用程序(由VS2008 / VS2008 Express生成)中,Error.aspx(由VS生成)使用母版页。

如果Master Page访问任何ViewData,它将抛出null引用Exception,则不会显示error.aspx。

使用此简单代码作为您的Error.aspx,它将解决问题,(以及CustomErrors = On)

<%@ Page Language="C#"  Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>
<%= Model.Exception.Message %>

答案 3 :(得分:1)

我遇到了同样的问题,经过调查,我发现我正在更新web.Debug.config下的web.config文件。

然后我在CustomErrors文件中创建了web.config标记,它对我有效。

答案 4 :(得分:1)

我最近遇到了类似的问题。事实证明,控制器中抛出异常(HomeController)的方法是由不同控制器(DispatchController)中的方法调用的。

我们必须将[HandleError]属性放在调用控制器上才能使其工作。

[HandleError(ExceptionType = typeof(SessionExpireException), View = "ErrorSessionExpired")]
public class DispatchController : Controller
{

我们还将自定义错误视图放在调用控制器的文件夹结构中 View folder showing custom error view in the Dispatch controller folder

答案 5 :(得分:0)

经过多次拉扯之后,我发现我的问题属于“在代码中抛出异常而在渲染错误视图时抛出另一个错误”的常规类别。我之前编写了一个强类型错误页面,期待System.Exception,然后当我切换到使用[HandleError]属性时,过滤器将错误页面传递给System.HandleErrorInfo。第二个异常发生在这一行(在Default.aspx.cs中):

httpHandler.ProcessRequest(HttpContext.Current);

混乱。

答案 6 :(得分:0)

我一直遇到类似的问题。通过这种“黑客”,我得到了理想的结果。

由于我的所有控制器都扩展了BaseController,因此无处不在。

public class BaseController : Controller
{
    protected override void OnException(ExceptionContext filterContext)
    {

        Response.Write("<pre>" + filterContext.Exception.StackTrace + "</pre>");

        base.OnException(filterContext);

    }

}