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); }
/// <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); }
/// <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 }; } } } }