我相信我已经设置了我们的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。可能会有一些从那里遗留下来的怪异设置?
我可以在其他应用上使用它,所以我有点沮丧。
答案 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
{
我们还将自定义错误视图放在调用控制器的文件夹结构中
答案 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);
}
}