/// <summary> /// Valida el modelo. /// Si el modelo no es válido se termina la ejecución de la petición devolviendo BadRequest y un StatusMessage. /// </summary> /// <param name="context">Contexto de ejecución.</param> public void OnActionExecuting(ActionExecutingContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } // Verifica que el modelo sea valido. if (context.ModelState.IsValid == false) { // Genera la excepción. ValidationException exception = context.ModelState.ToEntityValidationException(); IDictionary <string, string> validationErrors = (exception.Data[ExDataKey.ValidationErrors] as IDictionary <string, string>); // Genera un mensaje de respuesta. HttpStatusCode errorStatusCode = HttpStatusCode.BadRequest; StatusMessage response = StatusMessageBuilder.Create(exception, errorStatusCode, validationErrors); // Devuelve el objeto del tipo StatusMessage como resultado de la petición. context.Result = new ObjectResult(response) { StatusCode = (int)errorStatusCode, DeclaredType = typeof(StatusMessage) }; } }
/// <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> public void OnException(ExceptionContext context) { Exception exception = context.Exception; HttpStatusCode errorStatusCode = HttpStatusCode.InternalServerError; IDictionary <string, string> validationErrors = null; // Obtiene los errores de validación de la excepción. validationErrors = this.GetValidationErrors(exception); // Asigna un statusCode según el tipo de excepción. if (exception is NotFoundException) { errorStatusCode = HttpStatusCode.NotFound; } else if (exception is ValidationException || exception is BadRequestException) { errorStatusCode = HttpStatusCode.BadRequest; } else if (exception is InvalidOperationException || exception is ForbiddenException || exception is UniqueKeyViolationException || exception is ReferentialIntegrityViolationException) { errorStatusCode = HttpStatusCode.Forbidden; } else if (exception is UnauthorizedAccessException || exception is UnauthorizedException) { errorStatusCode = HttpStatusCode.Unauthorized; } else if (exception is ArgumentNullException || exception is ArgumentOutOfRangeException || exception is ArgumentException) { errorStatusCode = HttpStatusCode.InternalServerError; } else if (exception is BadGatewayException) { errorStatusCode = HttpStatusCode.BadGateway; } else if (exception is TimeoutException) { errorStatusCode = HttpStatusCode.GatewayTimeout; } else { // Otras excepciones. errorStatusCode = HttpStatusCode.InternalServerError; } // Obtiene la instancia de StatusMessage para armar la respuesta de la petición. StatusMessage response = StatusMessageBuilder.Create(exception, errorStatusCode, validationErrors); // Devuelve el objeto del tipo StatusMessage como resultado de la petición. context.Result = new ObjectResult(response) { StatusCode = (int)errorStatusCode, DeclaredType = typeof(StatusMessage) }; this.logger.LogError("GlobalExceptionFilter", exception); }