【问题标题】:ASP.NET MVC HandleError not working (customErrors is set to "On")ASP.NET MVC HandleError 不起作用(customErrors 设置为“On”)
【发布时间】:2009-06-15 22:55:03
【问题描述】:

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

[HandleError]
public class SupportController : BaseController {

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

已经web.config 中的customErrors 标签设置为“开启”:

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

但是,我仍然在异常情况下获得黄屏死机。在我的 Toss() 操作中设置断点表明 HttpContext.IsCustomErrorEnabled is 设置为 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。可能有一些古怪的设置从那里遗留下来?

我可以在其他应用程序上使用它,所以我有点困惑。

【问题讨论】:

  • 您的 error.aspx 页面是在 ~\Views\Support 还是 ~\Views\Shared 中?
  • ~\Views\Shared - 甚至尝试过 [HandleError(View = "~/Views/Shared/Error.aspx")] (没用)

标签: asp.net-mvc handleerror


【解决方案1】:

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

我个人认为这是 asp.net mvc 中的一个糟糕的设计(连同它的其余部分),但是您可以通过不使用相同的母版页来轻松解决这个问题(您甚至可以在您的母版页继承有一个继承的强类型母版页,该母版页纯粹从无类型的母版页继承图层..

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

【讨论】:

  • 你不是 100% 正确,但你让我走上了正轨。母版页没有模型,但它确实做了一些可能引发空引用异常的事情。使用非母版页视图有效。谢谢!
  • 很高兴为您提供帮助,asp.net mvc 中有很多令人头疼的问题,我似乎一直在寻找它们,并认为我应该为某人节省一些“头部到键盘影响”的操作。 :)
  • 这篇文章已经有一段时间了,但它对我也很有帮助
  • 正是我遇到的问题,stackoverflow 再次来救援!谢谢。
【解决方案2】:

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

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

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

@(new String(' ', 1000))

【讨论】:

  • 不只是在 IE9 中。我有 IE8 并遇到相同的行为。
【解决方案3】:

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

在 Template MVC Application(由 VS2008 / VS2008 Express 生成)中,Error.aspx(由 VS 生成)使用 Master Page。

如果母版页访问任何 ViewData 它将抛出空引用 Exception ,那么 error.aspx 将不会显示。

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

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

【讨论】:

    【解决方案4】:

    我一直遇到类似的问题。我能够通过这个“hack”获得理想的结果。

    由于我所有的控制器都扩展了 BaseController,所以这适用于任何地方。

    public class BaseController : Controller
    {
        protected override void OnException(ExceptionContext filterContext)
        {
    
            Response.Write("<pre>" + filterContext.Exception.StackTrace + "</pre>");
    
            base.OnException(filterContext);
    
        }
    
    }
    

    【讨论】:

      【解决方案5】:

      我也遇到了同样的问题,查了一下发现是在更新web.config下的web.Debug.config文件。

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

      【讨论】:

        【解决方案6】:

        我最近遇到了类似的问题。事实证明,引发异常的控制器 (HomeController) 中的方法被另一个控制器 (DispatchController) 中的方法调用。

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

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

        我们还将自定义错误视图放置在调用控制器的文件夹结构中。

        【讨论】:

          【解决方案7】:

          经过一番折腾,我发现我的问题属于“从代码中抛出异常只是为了在呈现错误视图时抛出另一个错误”的一般类别。我之前编写了一个强类型错误页面,期望出现 System.Exception,然后当我切换到使用 [HandleError] 属性时,过滤器正在向错误页面传递 System.HandleErrorInfo。第二个异常发生在这一行(在 Default.aspx.cs 中):

          httpHandler.ProcessRequest(HttpContext.Current);
          

          令人困惑。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-10-21
            • 1970-01-01
            • 2011-05-27
            • 1970-01-01
            • 1970-01-01
            • 2011-08-08
            • 2015-09-15
            相关资源
            最近更新 更多