Entendiendo el Middleware en .NET: Una Guía Sencilla
El middleware es el filtro por el que pasan todas las solicitudes HTTP en un API, apréndelo aquí 🐿️

Hey dev, el middleware es uno de los conceptos más importantes en .NET. Si estás construyendo aplicaciones web con .NET Core, entender cómo funciona el middleware es fundamental para que manejes de manera efectiva las solicitudes HTTP. En este artículo dev, vamos a explorar qué es el middleware, cómo funciona en .NET 8 (o en cualquier otra versión de .NET o .NET Core), y cómo puedes crear y utilizar middleware en tus aplicaciones, todo explicado con un lenguaje sencillito, vamos!

Qué es el middleware?

Imagina que una solicitud HTTP es como un mensaje que llega a tu aplicación web. Antes que el mensaje llegue a su destino final (como un controlador que devuelve una respuesta), pasa por una serie de "filtros" que pueden leer, modificar o incluso detener el mensaje. Estos "filtros" son lo que llamamos middleware y en una aplicación de tipo ASP.NET Core Web API están en la clase Program.

El middleware se organiza en una tubería (pipeline) por la que pasan todas las solicitudes, por eso también se le llama pipeline del middleware.

Cada pieza de middleware tiene dos trabajos principales:

  • Procesar la solicitud: Puede hacer algo con la solicitud, como registrar información o autenticar al usuario.
  • Pasar la solicitud al siguiente middleware: Después de procesar, puede dejar que la solicitud siga su camino hacia el siguiente middleware.

Cómo funciona?

Cuando una solicitud llega a tu aplicación, el middleware se encadena uno tras otro.

Cada middleware tiene la opción de:

  • Procesar la solicitud y enviarla al siguiente middleware.
  • Detener la solicitud y enviar una respuesta directamente al cliente.

El orden en el que configuras el middleware es crucial porque determina cómo se procesa la solicitud.

Tipos comunes de Middlewares

En .NET hay varios middlewares integrados y son muy importantes para la ejecución de toda aplicación, entre los tipos más comunes tenemos:

  • Autenticación y autorización: Para gestionar quién puede acceder y a qué recursos.
  • Manejo de errores: Para capturar y manejar adecuadamente las excepciones.
  • Logging o registro: Guardar información sobre las solicitudes y respuestas.
  • Enrutamiento o routing: Decide qué controlador o acción debe manejar la solicitud.

Ejemplo práctico

Veamos un ejemplo simple de cómo crear y usar middleware en una aplicación .NET 8:

Program

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseMiddleware<CustomMiddleware>();

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

CustomMiddleware

    public class CustomMiddleware
    {
        private readonly RequestDelegate _next;

        public CustomMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task InvokeAsync(HttpContext context)
        {
            //Registrar información sin alterar la respuesta
            Console.WriteLine("Procesando solicitud para: " + context.Request.Path);

            //Llamar al siguiente middleware del pipeline
            await _next(context);
        }
    }

Aquí lo que pasó fue lo siguiente:

En Program.cs he registrado un middleware personalizado CustomMiddleware en el pipeline de solicitudes. Este middleware se ejecutará en cada solicitud que llega a la aplicación.

En CustomMiddleware: Se pasa al constructor el delegado que representa el siguiente middleware en la cadena. Esto es necesario para que tu middleware pueda pasar la solicitud al siguiente middleware.

Todo middleware personalizado que crees debe tener el método Invoke o InvokeAsync, sino obtendrás una excepción InvalidOperationException.

El middleware personalizado en su método InvokeAsync simplemente registra la ruta de la solicitud y luego pasa la solicitud al siguiente middleware o controlador en la cadena. Este enfoque asegura que cada solicitud sea procesada de manera uniforme y que todos los componentes necesarios del pipeline se ejecuten correctamente.

Conclusiones

El middleware es una parte fundamental de cómo .NET procesa las solicitudes. Entender cómo configurarlo y utilizarlo correctamente te permitirá construir aplicaciones web más robustas y flexibles por supuesto, ser un dev más completo 🐿️😉.

Hey genio, si esta entrada te ha gustado, entonces compártela mi crack! 🙌🐿️

Créditos de imagen de portada: Foto de Victor en Unsplash

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *