C# OnActionExecutionAsync在抛出异常后调用自己
在我的场景中,我需要在抛出该异常时停止应用程序C# OnActionExecutionAsync在抛出异常后调用自己,c#,asp.net-core,exception,.net-core,C#,Asp.net Core,Exception,.net Core,在我的场景中,我需要在抛出该异常时停止应用程序 public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { int approvalId = 0; switch (this.parameterLocation) { case Parameter
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();
}
}
公共重写异步任务OnActionExecutionAsync(ActionExecutionContext上下文,ActionExecutionDelegate下一步)
{
int-approvalId=0;
开关(此参数位置)
{
案例参数位置。Url:
approvalId=Convert.ToInt32(context.ActionArguments[“id”]);
打破
案例参数位置。正文:
打破
违约:
抛出新异常(“未知参数位置”);
}
var service=context.HttpContext.RequestServices.GetService();
var badge=checksumultils.GetBadgeFromToken(context.HttpContext);
var valid=等待服务。ValidateApprovalRequest(approvalId,badge);
如果(!有效)
{
抛出新的UnauthorizedAccessException(ResponseMessages.UNAUTHORIZED_ACCESS_CONTROLLER);
}
其他的
{
等待下一个();
}
}
我在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);
});
});
app.UseExceptionHandler(errorApp=>
{
errorApp.Run(异步上下文=>
{
var errorFeature=context.Features.Get();
var exception=errorFeature.Error;
var responseDetails=new BaseResponse();
开关(例外)
{
案例UnauthorizedAccessException UnauthorizedAccessException:
CreateResponse(异常,Models.Enums.InternalCode.Unauthorized);
responseDetails.httpStatusCode=System.Net.httpStatusCode.Unauthorized;
打破
违约:
如果(异常就是异常)
{
CreateResponse(异常,Models.Enums.InternalCode.GenericError);
responseDetails.httpStatusCode=System.Net.httpStatusCode.BadRequest;
}
打破
}
string response=JsonConvert.SerializeObject(responseDetails,Formatting.None,new JsonSerializerSettings()
{
NullValueHandling=NullValueHandling.Ignore
});
context.Response.StatusCode=Convert.ToInt32(responseDetails.httpStatusCode);
context.Response.ContentType=“应用程序/问题+json”;
wait context.Response.WriteAsync(Response);
});
});
我的问题是应用程序调用这两个方法两次,第一次调用OnActionExecutionAsync并执行所有验证,如果throw new UnauthorizedAccessException在startup.cs上调用该方法,则在该方法中,应用程序将返回错误给用户,再次调用OnActionExecutionAsync,再次调用OnActionExecutionAsync调用startup.cs,在第二次调用中返回错误。
有什么建议吗?这是Swagger对401 HTTP状态码的限制,特别是当使用postman或frontend app调用同一请求时,它会正常运行。我尝试了OnAction执行其中一个,结果相同。。。