我正在使用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...()
。
那么如何重定向到我的错误操作?
答案 0 :(得分:8)
HttpContext
上显示ExceptionContext
,因此您可以将其用于重定向。
context.HttpContext.Response.Redirect("...");
还有一个Result
属性,但我不知道它是否会在执行过滤器后被解释。值得一试的是:
context.Result = new RedirectResult("...");
如果有效,它也可以与RedirectToActionResult
或RedirectToRouteResult
一起使用。
答案 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
}
}
当然,您可以将异常,控制器和引发异常的动作传递给控制器的动作,然后从那里进行处理。