我在启动时有以下设置。
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中间件。知道怎么做吗?
答案 0 :(得分:0)
如果您还想使用状态代码中间件,则无法从操作过滤器设置结果。查看the source code中状态代码中间件的前提条件,如果响应主体已设置或已写入客户端,它将跳过状态代码页管道执行。