0Pricing
C# Academy · Lekcja

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 JSON

Pliki 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 policies

CORS 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 pipeline

Praktyczny 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

  1. Przegląd potoku ASP.NET Core
  2. Pisanie niestandardowego middleware
  3. Skracanie i rozgałęzianie potoku
  4. Kolejność middleware i wbudowane middleware
← Powrót do C# Academy