0Pricing
C# Academy · Lección

Middleware y filtros en Minimal APIs

Añada autenticación, autorización, gestión de excepciones y filtros de endpoints a las canalizaciones de Minimal API.

Middleware y filtros en Minimal APIs es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.

Middleware frente a filtros de endpoints

ASP.NET Core tiene dos capas de extensibilidad: middleware (envuelve toda la canalización y se ejecuta para cada solicitud) y filtros de endpoints (se ejecutan solo para endpoints específicos). Ambos funcionan en las API Minimal.

Adición de middleware a las API Minimal

El middleware estándar de ASP.NET Core se agrega mediante métodos app.Use*. El orden es importante: el middleware se ejecuta en el orden en que se registra.

var app = builder.Build();

app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.UseRateLimiter();

app.MapGet("/secure", () => "Protected endpoint")
   .RequireAuthorization();

app.Run();

Filtros de endpoints en línea

Los filtros de endpoints son como middleware limitado a un solo endpoint. Use AddEndpointFilter para agregar un filtro en línea. Los filtros pueden interrumpir el procesamiento al devolver un resultado sin llamar a next.

app.MapGet("/guarded", () => "Secret data")
   .AddEndpointFilter(async (ctx, next) =>
   {
       var header = ctx.HttpContext.Request.Headers["X-Api-Key"];
       if (header != "my-secret-key")
           return Results.Unauthorized();

       return await next(ctx); // proceed to handler
   });

Filtros de endpoints basados en clases

Implemente IEndpointFilter para crear filtros reutilizables. Puede aplicarlos a endpoints individuales o a grupos de rutas completos.

public class LoggingFilter : IEndpointFilter
{
    private readonly ILogger<LoggingFilter> _logger;
    public LoggingFilter(ILogger<LoggingFilter> logger) => _logger = logger;

    public async ValueTask<object?> InvokeAsync(
        EndpointFilterInvocationContext ctx,
        EndpointFilterDelegate next)
    {
        _logger.LogInformation("Before: {Path}", ctx.HttpContext.Request.Path);
        var result = await next(ctx);
        _logger.LogInformation("After: {Path}",  ctx.HttpContext.Request.Path);
        return result;
    }
}

// Apply to a group
app.MapGroup("/api").AddEndpointFilter<LoggingFilter>();

Middleware de gestión de excepciones

Use app.UseExceptionHandler o el middleware integrado de ProblemDetails para capturar excepciones no controladas y devolver respuestas de problemas RFC 7807.

builder.Services.AddProblemDetails();

var app = builder.Build();

app.UseExceptionHandler();
// OR for custom logic:
app.UseExceptionHandler(errApp =>
    errApp.Run(async ctx =>
    {
        var ex = ctx.Features.Get<IExceptionHandlerFeature>()?.Error;
        ctx.Response.StatusCode = 500;
        await ctx.Response.WriteAsJsonAsync(new { error = ex?.Message });
    }));

Middleware de interrupción inmediata

Use app.MapShortCircuit() (.NET 8+) o Results.StatusCode() en un filtro para devolver inmediatamente una respuesta sin ejecutar toda la canalización.

// Block known bad bots at the edge
app.MapGet("/robots.txt", () => "User-agent: *\nDisallow: /")
   .ShortCircuit(); // .NET 8: returns response immediately

// Or in a filter:
app.MapGet("/maintenance", () => "OK")
   .AddEndpointFilter((ctx, next) =>
       ValueTask.FromResult<object?>(Results.StatusCode(503)));

Limitación de solicitudes en .NET 7+

El middleware integrado de limitación de solicitudes protege los endpoints frente al uso abusivo. Aplique políticas globalmente o por endpoint con RequireRateLimiting().

using System.Threading.RateLimiting;

builder.Services.AddRateLimiter(opt =>
{
    opt.AddFixedWindowLimiter("fixed", o =>
    {
        o.PermitLimit     = 10;
        o.Window          = TimeSpan.FromSeconds(10);
        o.QueueLimit      = 0;
        o.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
    });
    opt.RejectionStatusCode = StatusCodes.Status429TooManyRequests;
});

app.UseRateLimiter();
app.MapGet("/search", Search).RequireRateLimiting("fixed");

Configuración de CORS

Configure las políticas de CORS en los servicios y aplíquelas globalmente o por endpoint para controlar qué orígenes pueden acceder a su API.

builder.Services.AddCors(opt =>
    opt.AddPolicy("AllowFrontend", policy =>
        policy.WithOrigins("https://myapp.com")
              .AllowAnyHeader()
              .AllowAnyMethod()));

app.UseCors("AllowFrontend");

// Or per endpoint:
app.MapGet("/public-data", () => "data")
   .RequireCors("AllowFrontend");

Middleware de almacenamiento en caché de salida

AddOutputCache almacena las respuestas en caché en el servidor. Aplíquelo a endpoints específicos para servir respuestas almacenadas en caché sin consultar la base de datos en cada solicitud.

builder.Services.AddOutputCache();

app.UseOutputCache();

app.MapGet("/products", async (AppDbContext db) =>
    Results.Ok(await db.Products.AsNoTracking().ToListAsync()))
   .CacheOutput(p => p.Expire(TimeSpan.FromMinutes(5)));

Orden y encadenamiento de filtros

Los filtros se ejecutan en el orden en que se agregan (el más externo primero y el más interno al final, como el middleware). Puede encadenar varios filtros en el mismo endpoint o grupo.

app.MapPost("/orders", CreateOrder)
   .AddEndpointFilter<LoggingFilter>()      // runs first
   .AddEndpointFilter<ValidationFilter>()   // runs second
   .AddEndpointFilter<AuthFilter>()         // runs third
   .RequireAuthorization();                 // JWT checked by middleware

Caso real: middleware para claves de API

Un middleware reutilizable para claves de API que lee la clave de un encabezado y devuelve inmediatamente una respuesta 401 si no es válida.

public class ApiKeyMiddleware
{
    private readonly RequestDelegate _next;
    private readonly string _expectedKey;

    public ApiKeyMiddleware(RequestDelegate next, IConfiguration cfg)
    {
        _next = next;
        _expectedKey = cfg["ApiKey"] ?? throw new Exception("ApiKey not configured");
    }

    public async Task InvokeAsync(HttpContext ctx)
    {
        if (!ctx.Request.Headers.TryGetValue("X-Api-Key", out var key)
            || key != _expectedKey)
        {
            ctx.Response.StatusCode = 401;
            await ctx.Response.WriteAsync("Invalid API key");
            return;
        }
        await _next(ctx);
    }
}

app.UseMiddleware<ApiKeyMiddleware>();

Comprobación rápida

¿Cuál es la diferencia principal entre el middleware y los filtros de endpoints en las API Minimal?

Resumen: middleware y filtros

Puntos clave:

  • El middleware (UseX) se ejecuta globalmente, en el orden de la canalización, para cada solicitud
  • Los filtros de endpoints (AddEndpointFilter) se limitan a endpoints o grupos específicos
  • Implemente IEndpointFilter para crear clases de filtros reutilizables y compatibles con DI
  • Middleware integrado: limitación de solicitudes, CORS, almacenamiento en caché de salida y gestión de excepciones
  • El orden de los filtros es importante: se anidan como el middleware (el primero que se agrega es el más externo)

Preguntas frecuentes

¿La lección «Middleware y filtros en Minimal APIs» es gratis?

Sí — el texto completo de «Middleware y filtros en Minimal APIs» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Middleware y filtros en Minimal APIs»?

Añada autenticación, autorización, gestión de excepciones y filtros de endpoints a las canalizaciones de Minimal API. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C# Academy?

No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Middleware y filtros en Minimal APIs»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C# Academy?

Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Creación de su primera Minimal API
  2. Grupos de rutas, parámetros y validación
  3. Middleware y filtros en Minimal APIs
  4. OpenAPI, versionado y despliegue
← Volver a C# Academy