OnActionExecutionAsyn c Вызывающий себя после исключения Throw - PullRequest
0 голосов
/ 16 января 2020

в моем сценарии мне нужно было остановить приложение при выдаче этого исключения.

    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 внутри Configure:

   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);
            });

        });

Моя проблема если приложение вызывает эти два метода дважды, сначала вызывает OnActionExecutionAsyn c и выполняет все проверки, если метод throw new UnauthorizedAccessException вызывает метод для startup.cs, в этом методе вместо этого приложение возвращает ошибку пользователю, вызывает OnActionExecutionAsyn c снова и OnActionExecutionAsyn c вызовите startup.cs еще раз, в этот второй раз вернитесь с ошибкой. Любой совет?

1 Ответ

0 голосов
/ 16 января 2020

Это ограничение от Swagger с кодом статуса 401 HTTP, особенно при вызове одного и того же запроса с приложением почтальона или веб-интерфейса, все выполняется нормально.

...