public Task OnExceptionAsync(ExceptionContext context)
        {
            if (!(context.Exception is ValidateException exception))
            {
                return(Task.CompletedTask);
            }

            context.Exception = null;

            var output = new FailureResultOutputModel
            {
                Id         = AsyncContext.CorrelationId,
                Method     = $"{context.HttpContext.Request.Path}.{context.HttpContext.Request.Method}",
                Status     = "ValidationError",
                ApiVersion = AsyncContext.Version
            };

            output.Errors.Add(new FailureInformation
            {
                ErrorCode   = 30001,
                Message     = exception.Result.Error.Message,
                Description = exception.Result.Error.Description
            });

            context.ExceptionHandled = true;
            context.HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
            context.Result = new JsonResult(output);

            return(Task.CompletedTask);
        }
Example #2
0
        /// <inheritdoc />
        /// <summary>
        /// Called after an action has thrown an <see cref="T:System.Exception" />.
        /// </summary>
        /// <param name="context">The <see cref="T:Microsoft.AspNetCore.Mvc.Filters.ExceptionContext" />.</param>
        /// <returns>
        /// A <see cref="T:System.Threading.Tasks.Task" /> that on completion indicates the filter has executed.
        /// </returns>
        public async Task OnExceptionAsync(ExceptionContext context)
        {
            var isValidateException = context.Exception is ValidateException;

            if (isValidateException.Equals(false))
            {
                var result = new FailureResultOutputModel
                {
                    Id         = AsyncContext.CorrelationId,
                    Method     = $"{context.HttpContext.Request.Path}.{context.HttpContext.Request.Method}",
                    Status     = "ValidationError",
                    ApiVersion = AsyncContext.Version,
                    Errors     = new List <FailureInformation>
                    {
                        new FailureInformation
                        {
                            ErrorCode   = 30001,
                            Message     = context.Exception.Message,
                            Description = context.Exception.ToString()
                        }
                    }
                };

                context.Result = new ObjectResult(result)
                {
                    StatusCode = (int)HttpStatusCode.InternalServerError
                };

                context.ExceptionHandled = true;

                await Task.Yield();
            }
        }
        public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            var parameters = context.ActionArguments;

            if (parameters.Count <= 0)
            {
                await base.OnActionExecutionAsync(context, next);
            }

            var parameter = parameters.FirstOrDefault();

            if (parameter.Value == null)
            {
                context.Result = new BadRequestObjectResult("未輸入 Parameter");
            }

            var validator        = Activator.CreateInstance(this._validatorType) as IValidator;
            var validationResult = await validator.ValidateAsync(parameter.Value);

            if (validationResult.IsValid.Equals(false))
            {
                var error = validationResult.Errors.FirstOrDefault();

                var failureOutputModel = new FailureResultOutputModel
                {
                    Id         = AsyncContext.CorrelationId,
                    ApiVersion = AsyncContext.Version,
                    Method     = $"{context.HttpContext.Request.Path}.{context.HttpContext.Request.Method}",
                    Status     = "VaildationError",
                    Errors     = new List <FailureInformation>
                    {
                        new FailureInformation
                        {
                            ErrorCode   = 30001,
                            Message     = "輸入資料驗證錯誤",
                            Description = error.ErrorMessage
                        }
                    }
                };

                context.Result = new BadRequestObjectResult(failureOutputModel);
            }

            await base.OnActionExecutionAsync(context, next);
        }
Example #4
0
        /// <inheritdoc />
        /// <summary>
        /// Called asynchronously before the action, after model binding is complete.
        /// </summary>
        /// <param name="context">The <see cref="T:Microsoft.AspNetCore.Mvc.Filters.ActionExecutingContext" />.</param>
        /// <param name="next">The <see cref="T:Microsoft.AspNetCore.Mvc.Filters.ActionExecutionDelegate" />. Invoked to execute the next action filter or the action itself.</param>
        /// <returns>
        /// A <see cref="T:System.Threading.Tasks.Task" /> that on completion indicates the filter has executed.
        /// </returns>
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            var executedContext = await next();

            if (executedContext.Result is ObjectResult result)
            {
                switch (result.Value)
                {
                case HttpResponseMessage _:
                    return;

                case SuccessResultOutputModel <object> _:
                    return;

                case FailureResultOutputModel _:
                    return;
                }

                var controllerTypeName = context.Controller.GetType().Name;

                if (controllerTypeName.Equals("ActionController", StringComparison.OrdinalIgnoreCase).Equals(false))
                {
                    var httpMethod = context.HttpContext.Request.Method;

                    if (result.StatusCode >= 400)
                    {
                        var failureResponse = new FailureResultOutputModel
                        {
                            Id         = AsyncContext.CorrelationId,
                            ApiVersion = AsyncContext.Version,
                            Method     = $"{context.HttpContext.Request.Path}.{httpMethod}",
                            Status     = "Faliure",
                            Errors     = new List <FailureInformation> {
                                (FailureInformation)result.Value
                            }
                        };

                        executedContext.Result = new ObjectResult(failureResponse)
                        {
                            StatusCode = result.StatusCode
                        };
                    }
                    else
                    {
                        var successResponse = new SuccessResultOutputModel <object>
                        {
                            Id         = AsyncContext.CorrelationId,
                            ApiVersion = AsyncContext.Version,
                            Method     = $"{context.HttpContext.Request.Path}.{httpMethod}",
                            Status     = "Success",
                            Data       = result.Value
                        };

                        executedContext.Result = new ObjectResult(successResponse)
                        {
                            StatusCode = result.StatusCode
                        };
                    }
                }
            }
        }