Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OnActionExecutionAsync在抛出异常后调用自己_C#_Asp.net Core_Exception_.net Core - Fatal编程技术网

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执行其中一个,结果相同。。。