Kolejność middleware i wbudowane middleware
Poznaj prawidłową kolejność middleware dla uwierzytelniania, routingu, CORS i obsługi wyjątków.
Kolejność middleware i wbudowane middleware to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.
Dlaczego kolejność ma znaczenie
Middleware ASP.NET Core jest uruchamiane dokładnie w kolejności rejestrowania. Nieprawidłowa kolejność prowadzi do luk w zabezpieczeniach, problemów z wydajnością lub nieprawidłowego działania — na przykład routing musi poprzedzać autoryzację, a autoryzacja wykonanie endpointu.
Zalecana kolejność middleware
Firma Microsoft dokumentuje zalecaną kolejność. Odstępstwa od niej powodują trudne do zdiagnozowania problemy. Oto kanoniczna kolejność dla produkcyjnego interfejsu API ASP.NET Core.
// 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();Obsługa wyjątków jako pierwsza
Middleware obsługi wyjątków musi znajdować się jako pierwsze, czyli najbardziej zewnętrzne, aby przechwytywać wyjątki ze wszystkich kolejnych elementów middleware i endpointów.
// 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 JSONPliki statyczne przed routingiem
Pliki statyczne (UseStaticFiles) powinny być obsługiwane przed routingiem. Obsłużenie pliku statycznego zatrzymuje potok — dla /css/main.css nie ma potrzeby uruchamiania uwierzytelniania ani routingu.
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.Uwierzytelnianie przed autoryzacją
UseAuthentication musi znajdować się przed UseAuthorization. Uwierzytelnianie wypełnia obiekt HttpContext.User, a autoryzacja sprawdza tego użytkownika względem zasad.
// 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 przed uwierzytelnianiem
Middleware CORS musi działać przed uwierzytelnianiem, aby wstępne żądania OPTIONS były obsługiwane bez wymagania nagłówków uwierzytelniania.
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();Typowe wbudowane komponenty middleware
ASP.NET Core zawiera wiele wbudowanych komponentów middleware. Wiedza o tym, do czego służy każdy z nich, pomaga zrozumieć, kiedy i jak ich używać.
// 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();Routing middleware — szczegółowe omówienie
UseRouting() dopasowuje przychodzące żądanie do wzorca trasy i zapisuje dopasowanie w HttpContext. Następnie UseEndpoints() (lub MapXxx()) wykonuje dopasowany endpoint.
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");Umiejscowienie kompresji odpowiedzi
Kompresja odpowiedzi musi znajdować się przed obsługą plików statycznych i routingiem, aby skompresowane dane wyjściowe zostały zapisane przed wygenerowaniem treści. Należy umieścić ją bezpośrednio po obsłudze wyjątków.
// Correct placement for response compression:
app.UseExceptionHandler();
app.UseResponseCompression(); // before static files
app.UseStaticFiles(); // compressed static files
app.UseRouting();
// ... rest of pipelinePraktyczny przykład: pełny potok produkcyjny
Kompletny potok produkcyjny łączący wszystkie zalecenia w dobrze uporządkowany i bezpieczny stos middleware.
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();Szybkie sprawdzenie
Dlaczego UseAuthentication musi znajdować się przed UseAuthorization w potoku middleware?
Podsumowanie: kolejność middleware i wbudowane komponenty middleware
Najważniejsze informacje:
- Najpierw obsługa wyjątków, pliki statyczne przed routingiem, uwierzytelnianie przed autoryzacją, CORS przed uwierzytelnianiem
- Kompresję odpowiedzi należy umieścić wcześnie (przed plikami statycznymi), aby uzyskać maksymalny efekt
- UseRouting + UseAuthorization + Map* — middleware znajdujący się między nimi może odczytywać dane trasy
- Wbudowane komponenty: UseHsts, UseHttpsRedirection, UseStaticFiles, UseRateLimiter, UseOutputCache
- Za pomocą
ctx.GetEndpoint()między UseRouting a MapXxx można odczytać informacje o dopasowanej trasie
Często zadawane pytania
Czy lekcja „Kolejność middleware i wbudowane middleware” jest bezpłatna?
Tak — pełny tekst „Kolejność middleware i wbudowane middleware” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Kolejność middleware i wbudowane middleware”?
Poznaj prawidłową kolejność middleware dla uwierzytelniania, routingu, CORS i obsługi wyjątków. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C# Academy?
Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Kolejność middleware i wbudowane middleware”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?
Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Przegląd potoku ASP.NET Core
- Pisanie niestandardowego middleware
- Skracanie i rozgałęzianie potoku
- Kolejność middleware i wbudowane middleware