【发布时间】: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