Kurse:Tägich Middleware Übungen

Aus ahrensburg.city
Version vom 23. Juni 2025, 20:52 Uhr von Thorsten (Diskussion | Beiträge) (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…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Ü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

  1. In welcher Reihenfolge werden die Ausgaben im Browser angezeigt?
  2. 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

  1. Erstelle eine Klasse `GreetingMiddleware` mit einem Konstruktor für `RequestDelegate`.
  2. Implementiere eine `Invoke`-Methode.
  3. Erstelle eine Erweiterungsmethode zur Registrierung.
  4. 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:

  1. UseStaticFiles
  2. UseRouting
  3. UseAuthorization
  4. UseHttpsRedirection
  5. UseAuthentication
  6. 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();
});