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 middlewareCaso 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
- Creación de su primera Minimal API
- Grupos de rutas, parámetros y validación
- Middleware y filtros en Minimal APIs
- OpenAPI, versionado y despliegue