MVC3错误处理 - 坚持使用名为“错误”的视图

时间:2011-12-19 00:11:54

标签: asp.net-mvc-3 error-handling

我为我的应用程序定义了自定义错误处理,并且它都运行得非常好 - 当找不到资源时,会显示正确的“NotFound”视图。当发生未填充的异常时,“ServerError”视图呈现。

我面临的问题是我的应用程序坚持尝试查找名为“错误”的视图,但找不到它,因为我没有,因此在我的自定义错误处理例程中抛出此异常:

“未找到视图'错误'或其主人,或者没有查看引擎支持搜索到的位置。搜索了以下位置:...”

我有一个Application_Error事件处理程序,它记录所有未处理的异常:

protected void Application_Error(Object sender, EventArgs e)
{
    Exception lastEx = Server.GetLastError();

    // Attempt to Log the error
    try
    {
        Utils.Logger.Error(lastEx);
    }
    catch (Exception loggingEx)
    {
        // Try and write the original ex to the Trace
        Utils.TryTrace(lastEx.Message);

        // Try and write the logging exception to the Trace
        Utils.TryTrace(loggingEx.Message);
    }
}

我在web.config中将customErrors设置为'On':

<customErrors mode="On" defaultRedirect="blah">
    <error statusCode="404" redirect="dee"/>
    <error statusCode="500" redirect="blah"/>
</customErrors>

我的Global.asax.cs RegisterRoutes方法中定义的路由对应于上面web.config中定义的重定向:

routes.MapRoute(
    "Error - 404",
    "dee",
    new { controller = "Error", action = "NotFound" }
    );

routes.MapRoute(
    "ServerError", // When this route is matched we want minimal error info displayed
    "blah",
    new { controller = "Error", action = "ServerError" }
    );

我有一个包含OnActionExecuted例程的BaseController:

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    Logger.Info(String.Format(Constants.LOG_ACTION_EXECUTED, filterContext.Controller.ToString(), filterContext.ActionDescriptor.ActionName));
    // Log any exceptions
    if (filterContext.Exception != null)
    {
        Stack<string> messages = new Stack<string>();
        Exception current = filterContext.Exception;
        messages.Push(current.Message);
        while (current.InnerException != null)
        {
            messages.Push(current.InnerException.Message);                    
            current = current.InnerException;
        }
        StringBuilder result = new StringBuilder();
        while (messages.Count != 0)
        {
            result.Append(messages.Pop());
            string nextline = messages.Count > 0 ? "OUTER EXCEPTION " + messages.Count + ": " : "";
            result.Append(Environment.NewLine);
        }
        Logger.Error(result.ToString());
    }
    base.OnActionExecuted(filterContext);
}

框架是否还有其他地方定义了在未处理的异常情况下要呈现的视图?

我的自定义错误处理例程是否缺少最后一步,这将确保框架不再期望找到'错误'视图???

2 个答案:

答案 0 :(得分:3)

您需要删除HandleErrorAttribute文件中的Global.asax.cs处理程序。此属性将视图设置为Error。然后MVC运行时将不会处理异常,异常将传播到Asp.Net运行时,它将使用customErrors部分来显示页面。

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute()); // remove this line
    }

答案 1 :(得分:0)

我已经删除了将过滤器自动添加到所有控制器的行 - 正如Eranga所建议的那样 - 因此,导致框架搜索“错误”的原因并非如此。图。

我遇到的问题是由于一些遗留在我的控制器之上的[HandleError]属性标签引起的。

所以有趣的是要注意:尽管我的控制器在其类定义的顶部装饰了[HandleError]属性,但我仍在调用web.config中定义的自定义错误处理例程。 - 并正确呈现所需的视图......

框架错误处理(由HandleErrorAttribute定义)将失败,我的Application_Error将捕获异常并通过我的&#39; Logger&#39;以静默方式将其记录到数据库中。实例...然后我的自定义错误处理例程将成功完成。