Kurse:Tägich Middleware Übungen: Unterschied zwischen den Versionen
Die Seite wurde neu angelegt: „= Übungen: Middleware in ASP.NET Core = == Übung 1: Middleware-Kette nachvollziehen == '''Ziel:''' Verstehe die Reihenfolge und das Verhalten von Middleware-Komponenten. === Aufgabe === Gegeben sei folgender Code: <syntaxhighlight lang="csharp"> app.Use(async (context, next) => { await context.Response.WriteAsync("1. Middleware beginnt\n"); await next(context); await context.Response.WriteAsync("1. Middleware endet\n"); }); app.Use(async…“ |
(kein Unterschied)
|
Aktuelle Version vom 23. Juni 2025, 20:52 Uhr
Übungen: Middleware in ASP.NET Core
Übung 1: Middleware-Kette nachvollziehen
Ziel: Verstehe die Reihenfolge und das Verhalten von Middleware-Komponenten.
Aufgabe
Gegeben sei folgender Code:
app.Use(async (context, next) => {
await context.Response.WriteAsync("1. Middleware beginnt\n");
await next(context);
await context.Response.WriteAsync("1. Middleware endet\n");
});
app.Use(async (context, next) => {
await context.Response.WriteAsync("2. Middleware beginnt\n");
await next(context);
await context.Response.WriteAsync("2. Middleware endet\n");
});
app.Run(async (context) => {
await context.Response.WriteAsync("Terminal Middleware\n");
});
Fragen
- In welcher Reihenfolge werden die Ausgaben im Browser angezeigt?
- Was passiert, wenn `next(context)` in einer der Middleware-Komponenten weggelassen wird?
Übung 2: Unterschied zwischen app.Use und app.Run
Ziel: Verstehe den Unterschied zwischen app.Use und app.Run.
Aufgabe
Ändere folgenden Code so, dass beide app.Run-Aufrufe tatsächlich ausgeführt werden:
app.Run(async (context) => {
await context.Response.WriteAsync("Run 1\n");
});
app.Run(async (context) => {
await context.Response.WriteAsync("Run 2\n");
});
Hinweis
Diskutiere: Warum funktioniert das so nicht? Wie müsste man stattdessen app.Use verwenden?
Übung 3: Eigene Middleware schreiben (konventionell)
Ziel: Eigene Middleware als Klasse schreiben.
Aufgabe
Erstelle eine Middleware-Klasse, die überprüft, ob ein Query-Parameter namens user existiert. Wenn ja, gib „Hello, {user}“ zurück. Falls nicht, rufe die nächste Middleware auf.
Schritte
- Erstelle eine Klasse `GreetingMiddleware` mit einem Konstruktor für `RequestDelegate`.
- Implementiere eine `Invoke`-Methode.
- Erstelle eine Erweiterungsmethode zur Registrierung.
- Binde die Middleware im Pipeline-Setup ein.
Übung 4: UseWhen einsetzen
Ziel: Conditional Middleware mit UseWhen.
Aufgabe
Verwende `UseWhen`, um nur dann Logging-Middleware zu aktivieren, wenn die URL ein bestimmtes Query-Flag enthält (z.B. `?debug=true`).
Beispielcode-Gerüst
app.UseWhen(
context => context.Request.Query.ContainsKey("debug"),
app => {
app.Use(async (context, next) => {
Console.WriteLine("Debug aktiviert");
await next();
});
});
Übung 5: Reihenfolge der Middleware reflektieren
Ziel: Die Bedeutung der Middleware-Reihenfolge verstehen.
Aufgabe
Ordne folgende Middleware-Komponenten in die logische, empfohlene Reihenfolge:
- UseStaticFiles
- UseRouting
- UseAuthorization
- UseHttpsRedirection
- UseAuthentication
- UseDeveloperExceptionPage
Bonus-Frage
Warum ist `UseExceptionHandler`/`UseDeveloperExceptionPage` ganz vorne in der Reihenfolge wichtig?
Bonus-Übung: Short-Circuiting verstehen
Ziel: Verhalten bei Abbruch der Pipeline (short-circuit) analysieren.
Aufgabe
Füge eine Middleware hinzu, die bei einem bestimmten Pfad (z. B. `/blocked`) die Anfrage sofort beantwortet mit "Zugriff verweigert", ohne den weiteren Verlauf der Pipeline aufzurufen.
app.Use(async (context, next) => {
if (context.Request.Path == "/blocked")
{
await context.Response.WriteAsync("Zugriff verweigert");
return; // Pipeline wird hier abgebrochen
}
await next();
});