Пример #1
0
        /// <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)
                };
            }
        }
Пример #2
0
        /// <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);
        }