Programación, Tecnología y Más...

Programación, Tecnología y Más...

Middleware para Manejo de Errores .Net

 En este artículo aprenderemos como manejar los errores en nuestras aplicaciones de .Net usando un Middleware personalizado.

Si no sabes que es un middleware aquí te dejo la definición y explicación como se implementan en. Net ASP.NET Core Middleware.

En resumen, podría decirse que un middleware es un fragmento de código  que se inserta en la canalización de procesamiento de solicitudes, para procesar solicitudes entrantes y respuestas salientes antes de que lleguen a su destino final.

Con los middlewares podemos realizar diferentes tareas como autenticación, autorización, etc. 

Pero en este ejemplo nos veremos como usarlo para el manejo de errores

Lo primero que haremos será crearnos un nuevo proyecto web API (puede usarse en cualquier tipo de proyecto no tiene que ser web API)

En mi caso lo crearé con el Visual Studio 2022  y le llamaré MiddlewareError

MiddlewareError


En el controlador que se crea por defecto WeatherForecastController nos crearemos un nuevo enpoint sencillo que haga el cálculo de una división

GetCalculate

En un enpoint sencillo, pero que nos servirá para este ejemplo, lo único que hace este endpoint es recibir 2 números y hace la división de estos números y luego retorna la respuesta


Pero que pasa si tratas de hacer una división entre 0, esto te genera un excepción que de momento no se está controlando y te retorna un status code 500 con la excepción 






Por lo general lo que haríamos para resolver este tipo de problemas sería envolver nuestro código dentro de un try catch para poder controlar este tipo de excepciones


De esta manera cualquier excepción no controlada en nuestro código entraría al catch y podríamos controlar el tipo de retorno.


El problema de esto(y lo común que hacemos) es que  en cada enpoint debemos ir colocando el try catch, ahí es donde entra en juego el middleware nos permite tener centralizado el manejo de excepciones.

Para implementar el middleware nos crearemos una carpeta Middlewares(por si implementas más middlewares) y nos crearemos una clase llamada ExceptionHandlingMiddleware





namespace MiddlewareError.Middlewares
{
    public class ExceptionHandlingMiddleware
    {
        private readonly RequestDelegate _next;
        public ExceptionHandlingMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task InvokeAsync(HttpContext httpContext)
        {
            try
            {
                await _next(httpContext);
            }
            catch (Exception ex)
            {
                await HandleExceptionAsync(httpContext, ex);
            }
        }
        private async Task HandleExceptionAsync(HttpContext context, Exception exception)
        {
            context.Response.ContentType = "application/json";
            var response = context.Response;

            var errorResponse = new ErrorResponseDTO();

            response.StatusCode = (int)HttpStatusCode.InternalServerError;
            errorResponse.Message = exception.Message;


            var result = JsonSerializer.Serialize(errorResponse);
            await context.Response.WriteAsync(result);
        }
    }
}

public class ErrorResponseDTO
{
    public string Message { get; set; }
}

Te explico lo más impórtante del Middleware, tenemos la clase llamada ExceptionHandlingMiddleware lo importante de esta clase es el método InvokeAsync que es donde nosotros tenemos un try catch general y en donde cada petición que se realice pasara por este try catch.


Cada vez que se ejecute cualquier petición se ejecuta el Middleware si todo está bien el código se ejecuta normalmente(por eso vemos un delegate que se llama _next que hace referencia a que si todo esté bien se ejecute la solicitud), pero si hay una excepción en la ejecución de la petición este caerá en el catch y ahí podremos controlar el retorno de la solicitud que hacemos en el método HandleExceptionAsync(podríamos incluso manejar nuestros tipos de excepciones)

Lo único que falta para implementar nuestro middleware es configurarlo en la clase Program


Con nuestro middleware implementado ya no necesitamos poner el try catch en ninguno de nuestro endpoints, si hay alguna excepción nuestro middleware se encargará de gestionar la respuesta.



De esta manera nuestro código queda más limpio, y tenemos el manejo de excepciones en nuestro middleware.

Incluso  podríamos implementar un manejo más controlado de nuestras excepciones.







puedes descargar el código desde este repositorio

si quieren donarme para una café lo pueden hacer aqui.

Hasta la próxima.

Saludos desde El Salvador...

Publicar un comentario

0 Comentarios