如何重新路由异常而不将Exception标记为已处理

时间:2015-05-05 11:29:43

标签: asp.net asp.net-mvc asp.net-mvc-4 iis exception-handling

基本上当我的应用程序有一个未处理的异常时,我希望它被IIS记录为未处理的异常(例如,它可以在事件查看器中看到),但我还想将用户路由到错误控制器。

我已覆盖控制器的OnException方法,以便将用户路由到自定义错误页面。问题的关键是这段代码:

    protected override void OnException(ExceptionContext filterContext)
    {
        filterContext.Result = RedirectToAction("GeneralError", "Error", new{ routeValueA = "some value", routeValueB = "some other value"});
        filterContext.ExceptionHandled = false;
    }

我的问题是:如果我设置filterContext.ExceptionHandled = false,那么我会得到一个黄色的死亡屏幕,而不是被重新路由到我的错误处理控制器。如果我设置filterContext.ExceptionHandled = true,那么我会被重新路由,但异常不会被记录为未处理的异常。

我知道我可以使用web.config设置静态错误页面,但我想要这样做,因为我不能动态使用路由值将数据发送到我的错误控制器。

我可以成功地将结果设置为filterContext.Result而不标记filterContext.ExceptionHandled= true吗?

2 个答案:

答案 0 :(得分:2)

尝试从 this 来源

开始关注
protected override void OnException(ExceptionContext filterContext)
{
    if (filterContext.ExceptionHandled)
    {
        return;
    }
    filterContext.Result = new ViewResult
    {
        ViewName = "~/Views/Shared/Error.aspx"
    };
    filterContext.ExceptionHandled = true;
}

或者你甚至可以试试这个

custom errors中设置web.config,如下所示:

<customErrors mode="On" defaultRedirect="~/Error">
  <error redirect="~/Error/NotFound" statusCode="404" />
  <error redirect="~/Error/UnauthorizedAccess" statusCode="403"/>
</customErrors>

您的 ErrorController

public class ErrorController : Controller
{
    public ViewResult Index()
    {
        return View("Error");
    }
    public ViewResult NotFound()
    {
        Response.StatusCode = 404;  //you may want to set this to 200
        return View("NotFound");
    }
    public ViewResult UnauthorizedAccess()
    {
        Response.StatusCode = 404;  //you may want to set this to 200
        return View("UnauthorizedAccess");
    }
}

HandleErrorAttribute注册为FilterConfig类中的全局操作过滤器,如下所示:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
     filters.Add(new CustomHandleErrorAttribute());
     filters.Add(new AuthorizeAttribute());
}

<强>更新

我建议您阅读 this answer ,因为它提供了您提出的问题的完整详细信息,我希望您能在那里找到一个好的解决方案!!

答案 1 :(得分:0)

我相信您要查找的是自定义错误页面,您可以在web.config文件中设置并告诉IIS重定向到自定义错误页面而不是默认页面(因为您称之为死亡的黄页:))对于任何未处理的例外情况。

这可能会有所帮助: How to make custom error pages work in ASP.NET MVC 4