ASP.NET MVC的HandleError未能工作(customErrors设置为“On”)

14

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

[HandleError]
public class SupportController : BaseController {

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

我已经在web.config中设置了我的customErrors标记为"On":

<customErrors mode="On"></customErrors>
然而,我仍然在出现异常时得到了“黄色屏幕死亡”的错误。在我的 Toss() 操作中设置断点显示 HttpContext.IsCustomErrorEnabled 已设置为 true。
我们没有对视图引擎做任何事情,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 的发布而升级。可能还留下了一些怪异的设置吗?

我可以让其他应用程序工作,所以我有点困惑。


你的 error.aspx 页面在 ~\Views\Support 还是 ~\Views\Shared 文件夹里? - Talljoe
尝试了在\Views\Shared目录下使用[HandleError(View = "/Views/Shared/Error.aspx")],但没有起作用。 - swilliams
7个回答

20

如果处理错误页面时出现问题,通常会发生这种情况。如果你调试应用程序,在最初的异常后,你可能会遇到另一个异常(来自错误页面的异常)。我曾经遇到过这种情况,原因是我有一个强类型的主控页,错误页面正在使用该主控页,由于主控页与实际页面共享相同的模型,主控页获取了一个 HandlerErrorInfo 模型,而不是我期望的类型化模型。

个人认为在 asp.net mvc 中,这是一个糟糕的设计(以及其他部分),但你可以通过不使用相同的主控页轻松解决此问题(甚至可以进行主控页继承,在继承的强类型主控页中完全继承未经过类型标记的主控页的层次结构)。

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


1
你并不是完全正确,但是你让我找到了正确的方向。母版页没有模型,但它确实执行了一些可能会引发空引用异常的操作。使用非母版页视图可以解决问题。谢谢! - swilliams
1
很高兴能够帮忙,ASP.NET MVC 中有很多让人头疼的问题,我似乎总是能找到它们,并且想着应该为某些人节省一些“头撞键盘”的行为。 :) - meandmycode
这篇文章已经有一段时间了,但它对我也很有帮助。 - Craig
正是我遇到的问题,stackoverflow再次拯救了我!谢谢。 - glosrob

3

不仅仅是在IE9中出现的问题。我使用的是IE8,也出现了相同的行为。 - rivarolle

2

这个问题的另一个原因可能是,在由VS2008 / VS2008 Express生成的模板MVC应用程序中,Error.aspx(由VS生成)使用了主控页。

如果主控页访问任何ViewData,它将抛出空引用异常,然后error.aspx将不会显示。

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

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

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

1

我一直遇到一个类似的问题。我使用这个“hack”方法得到了想要的结果。

由于我的所有控制器都扩展自BaseController,所以这在任何地方都有效。

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

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

        base.OnException(filterContext);

    }

}

1

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

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


0
经过长时间的挣扎,我发现我的问题属于“仅从代码中抛出异常以在渲染错误视图时引发另一个错误”的一般类别。我早些时候编写了一个期望System.Exception的强类型错误页面,然后当我切换到使用[HandleError]属性时,过滤器会将错误页面传递给System.HandleErrorInfo。第二个异常发生在这一行(在Default.aspx.cs文件中):
httpHandler.ProcessRequest(HttpContext.Current);

令人困惑。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接