C# Academy · Les

Middleware en filters in Minimal APIs

Voeg authenticatie, autorisatie, exception handling en endpointfilters toe aan pipelines van Minimal APIs.

Les 3 van 413 stappen

Middleware en filters in Minimal APIs is een gratis C# Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C# Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C# Academy bevat in totaal 4 lessen.

Middleware versus eindpuntfilters

ASP.NET Core heeft twee uitbreidingslagen: middleware (omvat de volledige pijplijn en wordt voor elke aanvraag uitgevoerd) en eindpuntfilters (worden alleen voor specifieke eindpunten uitgevoerd). Beide werken in Minimal API's.

Middleware toevoegen aan Minimal API's

Standaard ASP.NET Core-middleware voeg je toe met app.Use*-methoden. De volgorde is belangrijk: middleware wordt uitgevoerd in de volgorde waarin deze is geregistreerd.

var app = builder.Build();

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

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

app.Run();

Inline-eindpuntfilters

Eindpuntfilters lijken op middleware met het bereik van één eindpunt. Gebruik AddEndpointFilter om inline een filter toe te voegen. Filters kunnen vroegtijdig stoppen door een resultaat terug te geven zonder next aan te roepen.

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
   });

Eindpuntfilters op basis van klassen

Implementeer IEndpointFilter om herbruikbare filters te maken. Je kunt ze toepassen op afzonderlijke eindpunten of op volledige routegroepen.

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 voor foutafhandeling

Gebruik app.UseExceptionHandler of de ingebouwde ProblemDetails-middleware om niet-afgevangen uitzonderingen op te vangen en probleemantwoorden volgens RFC 7807 te retourneren.

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 die vroegtijdig stopt

Gebruik app.MapShortCircuit() (.NET 8+) of Results.StatusCode() in een filter om onmiddellijk een antwoord te retourneren zonder de volledige pijplijn uit te voeren.

// 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)));

Snelheidsbeperking in .NET 7+

De ingebouwde middleware voor snelheidsbeperking beschermt eindpunten tegen misbruik. Pas beleid globaal of per eindpunt toe met 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");

CORS-configuratie

Configureer CORS-beleid in de services en pas het globaal of per eindpunt toe om te bepalen welke herkomsten toegang hebben tot je 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 voor uitvoercaching

AddOutputCache slaat antwoorden aan de serverzijde op in de cache. Pas dit toe op specifieke eindpunten om antwoorden uit de cache te leveren zonder bij elke aanvraag de database aan te spreken.

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)));

Volgorde en ketening van filters

Filters worden uitgevoerd in de volgorde waarin ze zijn toegevoegd (eerst de buitenste, als laatste de binnenste — net als middleware). Je kunt meerdere filters aan hetzelfde eindpunt of dezelfde groep koppelen.

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

Praktijkvoorbeeld: middleware voor API-sleutels

Herbruikbare middleware voor API-sleutels die de sleutel uit een header leest en bij een ongeldige sleutel vroegtijdig stopt met 401.

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>();

Korte controle

Wat is het belangrijkste verschil tussen middleware en eindpuntfilters in Minimal API's?

Samenvatting: middleware en filters

Belangrijkste punten:

  • Middleware (UseX) wordt voor elke aanvraag globaal uitgevoerd in de volgorde van de pijplijn
  • Eindpuntfilters (AddEndpointFilter) hebben betrekking op specifieke eindpunten of groepen
  • Implementeer IEndpointFilter voor herbruikbare, DI-vriendelijke filterklassen
  • Ingebouwde middleware: snelheidsbeperking, CORS, uitvoercaching en foutafhandeling
  • De volgorde van filters is belangrijk: ze worden genest zoals middleware (het eerst toegevoegde filter is het buitenste)
Gratis beginnen

Leer C# met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
93
Lessen
346

Veelgestelde vragen

Is de les “Middleware en filters in Minimal APIs” gratis?

Ja — de volledige tekst van “Middleware en filters in Minimal APIs” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus C# Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus C# Academy bevat in totaal 4 lessen.

Wat leer ik in “Middleware en filters in Minimal APIs”?

Voeg authenticatie, autorisatie, exception handling en endpointfilters toe aan pipelines van Minimal APIs. Je oefent met C# Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met C# Academy te beginnen?

Ervaring vooraf is niet nodig. C# Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “Middleware en filters in Minimal APIs”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over C# Academy?

Ja. Elke les over C# Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Uw eerste Minimal API maken
  2. Routegroepen, parameters en validatie
  3. Middleware en filters in Minimal APIs
  4. OpenAPI, versiebeheer en deployment
← Terug naar C# Academy