【问题标题】:OnActionExecutionAsync Calling himself after Throw exceptionOnActionExecutionAsync 抛出异常后调用自己
【发布时间】:2020-01-16 18:24:35
【问题描述】:

在我的场景中,我需要在抛出异常时停止应用程序。

    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        int approvalId = 0;
        switch (this.parameterLocation)
        {
            case ParameterLocation.Url:
                approvalId = Convert.ToInt32(context.ActionArguments["id"]);
                break;

            case ParameterLocation.Body:
                break;

            default:
                throw new Exception("Unknown parameter location");
        }         
        var service = context.HttpContext.RequestServices.GetService<IValidatorService>();
        var badge = ChecksumUtils.GetBadgeFromToken(context.HttpContext);
        var valid = await service.ValidateApprovalRequest(approvalId, badge);

        if (!valid)
        {
            throw new UnauthorizedAccessException(ResponseMessages.UNAUTHORIZED_ACCESS_CONTROLLER);
        }
        else
        {
            await next();
        }    
    }

我在我的 startup.cs 里面配置:

   app.UseExceptionHandler(errorApp =>
        {

            errorApp.Run(async context =>
            {
                var errorFeature = context.Features.Get<IExceptionHandlerFeature>();
                var exception = errorFeature.Error;
                var responseDetails = new BaseResponse<Object>();

                switch (exception)
                {                    
                    case UnauthorizedAccessException unauthorizedAccessException:
                        responseDetails.CreateResponse(exception, Models.Enums.InternalCode.Unauthorized);
                        responseDetails.httpStatusCode = System.Net.HttpStatusCode.Unauthorized;
                        break;                            
                    default:
                        if (exception is Exception)
                        {
                            responseDetails.CreateResponse(exception, Models.Enums.InternalCode.GenericError);
                            responseDetails.httpStatusCode = System.Net.HttpStatusCode.BadRequest;
                        }
                        break;

                }

                string response = JsonConvert.SerializeObject(responseDetails, Formatting.None, new JsonSerializerSettings()
                {
                    NullValueHandling = NullValueHandling.Ignore
                });

                context.Response.StatusCode = Convert.ToInt32(responseDetails.httpStatusCode);
                context.Response.ContentType = "application/problem+json";
                await context.Response.WriteAsync(response);
            });

        });

我的问题是应用程序调用这两个方法两次,首先调用 OnActionExecutionAsync 并进行所有验证,如果 throw new UnauthorizedAccessException 调用 startup.cs 上的方法,在此方法中应用程序向用户返回错误,调用再次 OnActionExecutionAsync 和 OnActionExecutionAsync 再次调用 startup.cs,在这第二次返回错误。 有什么建议吗?

【问题讨论】:

  • 我也尝试过 OnActionExecuting,结果相同...

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


【解决方案1】:

这是 Swagger 的限制,带有 401 HTTP 状态代码,特别是在使用邮递员或前端应用程序调用同一请求时,它运行正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多