C# 气泡异常在异常过滤器asp.net核心之后使用StatusPageCodes中间件

C# 气泡异常在异常过滤器asp.net核心之后使用StatusPageCodes中间件,c#,asp.net-core,exception-handling,middleware,exceptionfilterattribute,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.Excepti

我在启动中有以下设置

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);
    }
public override void OnException(ExceptionContext上下文)
{
APIRERROR APIRROR;
开关(context.Exception)
{
例外情况:
//处理显式的“已知”API错误
var ex=例外;
context.Exception=null;
APIRROR=新的APIRROR(例如StatusCode,例如Message){Messages=ex.Messages};
context.HttpContext.Response.StatusCode=ex.StatusCode;
打破
案例未经授权的访问例外情况:
APIRROR=新的APIRROR(401,“未授权访问”);
context.HttpContext.Response.StatusCode=401;
_loggingService.LogError(LogCategory.Api,context.Exception);
打破
违约:
//未处理的错误
APIRROR=新的APIRROR(500,context.Exception.GetBaseException().Message){Detail=context.Exception.StackTrace};
context.HttpContext.Response.StatusCode=500;
_loggingService.LogError(LogCategory.Api,context.Exception);
打破
}
//始终返回JSON结果
context.Result=新的JsonResult(APIRROR);
base.OnException(上下文);
}

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

如果你想同时使用状态码中间件,就不能设置动作过滤器的结果。查看中状态代码中间件的先决条件,如果响应主体已设置或已写入客户端,它将跳过状态代码页管道执行。

感谢您的回复。我已经删除了设置结果的代码。但是,我正在设置状态,如图所示。在和异常期间,我设置了500,服务器错误代码。但是,当UseStatusCodePagesWithReExecute中间件捕获时,它总是404。有什么想法吗?好的,找到了解决办法。在UseExceptionHandler中添加了完成当前任务的代码。app.UseExceptionHandler(appbuilder=>{appbuilder.Run(异步(上下文)=>{await Task.CompletedTask;});});。这将基本上在UseStatusCodePagesWithReExecute中间件中显示正确的上下文。这看起来很奇怪。仅调用不带参数的app.UseExceptionHandler()是否也能起到作用?如果使用不带参数的app.UseExceptionHandler(),则无法起作用。它给出一个通用浏览器错误页面,说明应用程序无法处理请求。找不出原因。401状态代码对我有效,但403状态代码对我无效。