в моем сценарии мне нужно было остановить приложение при выдаче этого исключения.
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 еще раз, в этот второй раз вернитесь с ошибкой. Любой совет?