Ordine dei middleware e middleware integrati
Comprenda l'ordine corretto dei middleware per autenticazione, routing, CORS e gestione delle eccezioni.
Ordine dei middleware e middleware integrati è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.
Perché l'ordine è importante
I middleware di ASP.NET Core vengono eseguiti esattamente nell'ordine in cui sono registrati. Un ordine errato causa vulnerabilità di sicurezza, problemi di prestazioni o comportamenti non corretti: ad esempio, il routing deve precedere l'autorizzazione, che a sua volta deve precedere l'esecuzione degli endpoint.
Ordine consigliato dei middleware
Microsoft documenta l'ordine consigliato. Discostarsi da esso crea problemi difficili da diagnosticare. Di seguito è riportato l'ordine canonico per un'API ASP.NET Core in produzione.
// 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();Gestione delle eccezioni per prima
Il middleware per la gestione delle eccezioni deve essere il primo, nella posizione più esterna, in modo da intercettare le eccezioni generate da tutti i middleware e gli endpoint successivi.
// 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 JSONFile statici prima del routing
I file statici, tramite UseStaticFiles, dovrebbero essere gestiti prima del routing. La restituzione di un file statico interrompe anticipatamente la pipeline: non è necessario eseguire l'autenticazione o il routing per /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.Autenticazione prima dell'autorizzazione
UseAuthentication deve precedere UseAuthorization. L'autenticazione valorizza HttpContext.User; l'autorizzazione verifica l'utente così valorizzato rispetto ai criteri.
// 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 prima dell'autenticazione
Il middleware CORS deve essere eseguito prima dell'autenticazione, in modo che le richieste preflight OPTIONS vengano gestite senza richiedere gli header di autenticazione.
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();Middleware integrati comuni
ASP.NET Core include numerosi componenti middleware integrati. Sapere a cosa serve ciascuno aiuta a capire quando e come utilizzarli.
// 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();Approfondimento sul middleware di routing
UseRouting() associa la richiesta in ingresso a un modello di route e memorizza l'associazione in HttpContext. UseEndpoints() (o MapXxx()) esegue quindi l'endpoint associato.
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");Posizionamento della compressione delle risposte
La compressione delle risposte deve essere eseguita prima dei file statici e del routing, in modo che l'output compresso venga scritto prima della generazione del contenuto. La posizioni subito dopo la gestione delle eccezioni.
// Correct placement for response compression:
app.UseExceptionHandler();
app.UseResponseCompression(); // before static files
app.UseStaticFiles(); // compressed static files
app.UseRouting();
// ... rest of pipelineCaso reale: pipeline completa per la produzione
Una pipeline di produzione completa che combina tutte le raccomandazioni in uno stack middleware sicuro e ordinato correttamente.
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();Verifica rapida
Perché UseAuthentication deve precedere UseAuthorization nella pipeline middleware?
Riepilogo: ordine dei middleware e middleware integrati
Punti chiave:
- Gestione delle eccezioni per prima, file statici prima del routing, autenticazione prima dell'autorizzazione, CORS prima dell'autenticazione
- La compressione delle risposte va eseguita all'inizio (prima dei file statici) per ottenere il massimo effetto
- UseRouting + UseAuthorization + Map*: il middleware interposto tra questi elementi può leggere i dati della route
- Integrati: UseHsts, UseHttpsRedirection, UseStaticFiles, UseRateLimiter, UseOutputCache
- Verifichi
ctx.GetEndpoint()tra UseRouting e MapXxx per leggere le informazioni sulla route associata
Domande Frequenti
La lezione «Ordine dei middleware e middleware integrati» è gratuita?
Sì — il testo completo di «Ordine dei middleware e middleware integrati» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.
Cosa imparerò in «Ordine dei middleware e middleware integrati»?
Comprenda l'ordine corretto dei middleware per autenticazione, routing, CORS e gestione delle eccezioni. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C# Academy?
Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Ordine dei middleware e middleware integrati»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C# Academy?
Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Panoramica della pipeline di ASP.NET Core
- Scrittura di middleware personalizzati
- Interruzione anticipata e ramificazione
- Ordine dei middleware e middleware integrati