从异常过滤器重定向

时间:2017-02-20 07:43:06

标签: c# asp.net asp.net-core asp.net-core-mvc

我正在使用ASP.NET Core。我的一个控制器调用服务,抛出各种异常。我想在异常过滤器(而不是中间件)中处理它们。

public class MyHandlerAttribute : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext c)
    {
      if (c.Exception is FooException) {
          // redirect with arguments to here
      } 
      else if (c.Exception is FooException) {
          // redirect with arguments to there
      }
      else {
          // redirect to main error action without arguments, as 500
      }
      base.OnException(c);
    }
}

与动作过滤器不同,异常过滤器不允许我访问Controller,因此我无法执行c.Result = controller.RedirectTo...()

那么如何重定向到我的错误操作?

2 个答案:

答案 0 :(得分:8)

HttpContext上显示ExceptionContext,因此您可以将其用于重定向。

context.HttpContext.Response.Redirect("...");

还有一个Result属性,但我不知道它是否会在执行过滤器后被解释。值得一试的是:

context.Result = new RedirectResult("...");

如果有效,它也可以与RedirectToActionResultRedirectToRouteResult一起使用。

答案 1 :(得分:0)

如果要重定向到控制器的操作并传递一个或多个值,则需要使用RouteValueDictionary。这适用于将数据从ExceptionFilterAttribute重定向和传递到控制器方法。

在下面的示例中,我将重定向到错误控制器的Test_Error操作,并传递一个整数值(id)。使用.NET Core 2.2对此进行了测试

自定义属性

public class Custom_ExceptionAttribute : ExceptionFilterAttribute, IExceptionFilter
{
    var routeData = new RouteValueDictionary(new {
                      controller = "Error",
                      action = "Test_Error",
                      id = 1,
                   });
    filterContext.ExceptionHandled = true;
    filterContext.Result = new RedirectToRouteResult(routeData);
    filterContext.Result.ExecuteResultAsync(filterContext);
}

具有控制权的控制器

public class ErrorController : Controller
{
     public IActionResult Test_Error(int id)
     {
         //do whatever
     }
}

当然,您可以将异常,控制器和引发异常的动作传递给控制器​​的动作,然后从那里进行处理。