在异常过滤器asp.net核心之后使用whilestatuspagecodes中间件冒泡异常

时间:2018-05-18 02:39:13

标签: c# asp.net-core exception-handling middleware exceptionfilterattribute

我在启动时有以下设置。

app.UseStatusCodePagesWithReExecute("/mvc/error/", "?statusCode={0}");

我还使用AddMvcCore()进行ExceptionFilter设置。异常过滤器如下。

public override void OnException(ExceptionContext context)
    {
        ApiError apiError;
        switch (context.Exception)
        {
            case ApiException exception:
                // handle explicit 'known' API errors
                var ex = exception;
                context.Exception = null;
                apiError = new ApiError(ex.StatusCode, ex.Message) { Messages = ex.Messages };
                context.HttpContext.Response.StatusCode = ex.StatusCode;
                break;

            case UnauthorizedAccessException _:
                apiError = new ApiError(401, "Unauthorized Access");
                context.HttpContext.Response.StatusCode = 401;
                _loggingService.LogError<ApiExceptionFilter>(LogCategory.Api,  context.Exception);
                break;

            default:
                // unhandled errors
                apiError = new ApiError(500, context.Exception.GetBaseException().Message) { Detail = context.Exception.StackTrace };
                context.HttpContext.Response.StatusCode = 500;
                _loggingService.LogError<ApiExceptionFilter>(LogCategory.Api, context.Exception);
                break;
        }

        // always return a JSON result
        context.Result = new JsonResult(apiError);

        base.OnException(context);
    }

问题是当一个动作方法发生异常时,过滤器会启动,但会发送一个JSON结果。我想要做的是将异常冒泡到UseStatusCodePagesWithReExecute中间件。知道怎么做吗?

1 个答案:

答案 0 :(得分:0)

如果您还想使用状态代码中间件,则无法从操作过滤器设置结果。查看the source code中状态代码中间件的前提条件,如果响应主体已设置或已写入客户端,它将跳过状态代码页管道执行。