Middleware-ordning och inbyggd middleware
Förstå korrekt middleware-ordning för autentisering, routing, CORS och felhantering.
Middleware-ordning och inbyggd middleware är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C# Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C# Academy innehåller totalt 4 lektioner.
Varför ordningen är viktig
ASP.NET Core-middleware körs exakt i den ordning som den registreras. Fel ordning kan orsaka säkerhetsluckor, prestandaproblem eller felaktigt beteende — routing måste till exempel komma före auktorisering, som i sin tur måste komma före körning av endpoints.
Rekommenderad ordning för middleware
Microsoft dokumenterar den rekommenderade ordningen. Om du avviker från den uppstår problem som är svåra att felsöka. Här är den kanoniska ordningen för ett ASP.NET Core-API i produktion.
// Recommended order:
app.UseExceptionHandler(); // 1. Catch all exceptions
app.UseHsts(); // 2. HTTP Strict Transport Security
app.UseHttpsRedirection(); // 3. Redirect HTTP to HTTPS
app.UseStaticFiles(); // 4. Serve static assets
app.UseRouting(); // 5. Match route patterns
app.UseCors(); // 6. Cross-Origin
app.UseAuthentication(); // 7. Who are you?
app.UseAuthorization(); // 8. Are you allowed?
app.UseRateLimiter(); // 9. Throttle
app.UseOutputCache(); // 10. Cache responses
// Map endpoints here
app.MapControllers();
app.Run();Felhantering först
Middleware för felhantering måste ligga först, längst ut, så att den fångar undantag från all efterföljande middleware och alla endpoints.
// Development: detailed error page
if (app.Environment.IsDevelopment())
app.UseDeveloperExceptionPage();
else
{
// Production: generic error page + structured response
app.UseExceptionHandler("/error");
app.UseHsts();
}
// OR: use ProblemDetails globally (recommended .NET 8+)
builder.Services.AddProblemDetails();
app.UseExceptionHandler();
// All unhandled exceptions -> RFC 7807 ProblemDetails JSONStatiska filer före routing
Statiska filer (UseStaticFiles) bör komma före routing. När en statisk fil levereras kortsluts pipelinen — det finns ingen anledning att köra autentisering eller routing för /css/main.css.
app.UseStaticFiles(); // serves wwwroot/* without going through auth
app.UseRouting(); // expensive: runs route matching
// If you put UseStaticFiles AFTER UseRouting, the route
// matcher runs unnecessarily for every .js/.css request.
// Serve static files first for better performance.Autentisering före auktorisering
UseAuthentication måste komma före UseAuthorization. Autentiseringen fyller i HttpContext.User, och auktoriseringen kontrollerar sedan den ifyllda användaren mot policyerna.
// WRONG ORDER — authorization runs before user is populated:
app.UseAuthorization(); // user is null → everything allowed!
app.UseAuthentication(); // too late
// CORRECT:
app.UseAuthentication(); // populates context.User
app.UseAuthorization(); // checks context.User against policiesCORS före autentisering
CORS-middleware måste köras före autentisering så att preflight-OPTIONS-förfrågningar hanteras utan att autentiseringsheaders krävs.
builder.Services.AddCors(opts =>
opts.AddPolicy("Frontend", p =>
p.WithOrigins("https://myapp.com")
.AllowAnyHeader()
.AllowAnyMethod()));
app.UseRouting();
app.UseCors("Frontend"); // before auth — handles OPTIONS pre-flight
app.UseAuthentication();
app.UseAuthorization();Vanliga inbyggda middlewarekomponenter
ASP.NET Core levereras med många inbyggda middlewarekomponenter. Genom att känna till vad varje komponent gör blir det lättare att förstå när och hur de ska användas.
// Compression: compresses responses (must be before static files)
builder.Services.AddResponseCompression();
app.UseResponseCompression();
// Request localization: sets culture from Accept-Language header
builder.Services.AddLocalization();
app.UseRequestLocalization();
// Health checks: /health endpoint
builder.Services.AddHealthChecks();
app.MapHealthChecks("/health");
// Forwarded headers: trust X-Forwarded-For from reverse proxy
app.UseForwardedHeaders();Fördjupning i routing-middleware
UseRouting() matchar den inkommande förfrågan mot ett routningsmönster och lagrar matchningen i HttpContext. UseEndpoints() (eller MapXxx()) kör sedan den matchade slutpunkten.
app.UseRouting(); // matches route, stores in context
// Between UseRouting and Map*: middleware can read route data
app.Use(async (ctx, next) =>
{
var endpoint = ctx.GetEndpoint();
var routeName = endpoint?.DisplayName;
Console.WriteLine($"Matched: {routeName}");
await next(ctx);
});
// All auth and other middleware go here
app.UseAuthentication();
app.UseAuthorization();
// Execute the matched endpoint
app.MapControllers();
app.MapGet("/", () => "Home");Svarskomprimeringens placering
Svarskomprimering måste placeras före statiska filer och routing så att komprimerad utdata skrivs innan innehållet genereras. Placera den direkt efter felhanteringen.
// Correct placement for response compression:
app.UseExceptionHandler();
app.UseResponseCompression(); // before static files
app.UseStaticFiles(); // compressed static files
app.UseRouting();
// ... rest of pipelineI praktiken: fullständig produktionspipeline
En komplett produktionspipeline som kombinerar alla rekommendationer till en välordnad och säker middleware-stack.
var app = builder.Build();
if (app.Environment.IsDevelopment())
app.UseDeveloperExceptionPage();
else { app.UseExceptionHandler(); app.UseHsts(); }
app.UseResponseCompression();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCors("AllowFrontend");
app.UseAuthentication();
app.UseAuthorization();
app.UseRateLimiter();
app.UseOutputCache();
app.MapHealthChecks("/health").AllowAnonymous();
app.MapControllers();
app.Run();Snabb kontroll
Varför måste UseAuthentication komma före UseAuthorization i middleware-pipelinen?
Sammanfattning: middlewareordning och inbyggd middleware
Viktigaste punkterna:
- Felhantering först, statiska filer före routing, autentisering före auktorisering, CORS före autentisering
- Svarskomprimering placeras tidigt (före statiska filer) för maximal effekt
- UseRouting + UseAuthorization + Map* — middleware mellan dem kan läsa routningsdata
- Inbyggda komponenter: UseHsts, UseHttpsRedirection, UseStaticFiles, UseRateLimiter, UseOutputCache
- Kontrollera
ctx.GetEndpoint()mellan UseRouting och MapXxx för att läsa information om den matchade routen
Lär dig C# med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 93
- Lektioner
- 346
Vanliga frågor
Är lektionen ”Middleware-ordning och inbyggd middleware” gratis?
Ja – hela texten till ”Middleware-ordning och inbyggd middleware” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C# Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C# Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Middleware-ordning och inbyggd middleware”?
Förstå korrekt middleware-ordning för autentisering, routing, CORS och felhantering. Ni övar på C# Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig C# Academy?
Du behöver inga förkunskaper. Utbildningen i C# Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Middleware-ordning och inbyggd middleware”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här C# Academy-lektionen?
Ja. Varje C# Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Översikt över ASP.NET Core-pipelinen
- Skriva anpassad middleware
- Kortslutning och förgrening
- Middleware-ordning och inbyggd middleware