C# Academy · Lektion

Kurzschließen und Verzweigen

Verwenden Sie MapWhen, UseWhen und terminierende Middleware, um die Pipeline abhängig von Anfragebedingungen zu verzweigen oder zu beenden.

Lektion 3 von 412 Schritte

Kurzschließen und Verzweigen ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Verzweigen und vorzeitiges Beenden

Nicht jede Anfrage sollte die vollständige Middleware-Pipeline durchlaufen. ASP.NET Core bietet Werkzeuge zum Verzweigen (Teilgruppen an andere Pipelines weiterleiten) und zum vorzeitigen Beenden (Verarbeitung stoppen und sofort zurückgeben).

Map: Dauerhafte Verzweigung nach Pfad

Map erstellt einen dauerhaften Zweig: Anfragen, die dem Präfix entsprechen, gelangen in den Zweig und kehren NIEMALS in die Hauptpipeline zurück.

app.Map("/api", apiApp =>
{
    apiApp.UseAuthentication();
    apiApp.UseAuthorization();
    apiApp.Run(async ctx =>
        await ctx.Response.WriteAsync("API branch"));
});

// Requests to /api/... enter the branch above.
// Requests to /public/... skip the branch entirely.
app.Run(async ctx =>
    await ctx.Response.WriteAsync("Main pipeline"));

MapWhen: Verzweigung nach Prädikat

MapWhen verzweigt anhand einer beliebigen Bedingung, etwa von Headern, Query-Parametern oder benutzerdefinierter Logik. Wie bei Map ist der Zweig dauerhaft und kehrt nicht in die Hauptpipeline zurück.

// Branch when a specific header is present
app.MapWhen(
    ctx => ctx.Request.Headers.ContainsKey("X-Internal"),
    internalApp =>
    {
        internalApp.UseMiddleware<InternalApiMiddleware>();
        internalApp.Run(async ctx =>
            await ctx.Response.WriteAsync("Internal route"));
    });

// Branch on query parameter
app.MapWhen(
    ctx => ctx.Request.Query.ContainsKey("legacy"),
    legacyApp => legacyApp.UseMiddleware<LegacyHandlerMiddleware>());

UseWhen: Bedingte Verzweigung mit Rückkehr

UseWhen ähnelt MapWhen, aber der Zweig kehrt nach seinem Abschluss in die Hauptpipeline zurück. So können Sie Middleware bedingt hinzufügen, ohne die Pipeline aufzuspalten.

// Log only for authenticated API calls; public routes not logged
app.UseWhen(
    ctx => ctx.Request.Path.StartsWithSegments("/api")
           && ctx.User.Identity?.IsAuthenticated == true,
    loggedApp =>
    {
        loggedApp.UseMiddleware<AuditMiddleware>();
    });

// All requests continue here after the branch
app.UseRouting();
app.MapControllers();

Vorzeitiges Beenden ohne Aufruf von Next

Jede Middleware kann die Pipeline vorzeitig beenden, indem sie die Antwort schreibt und next nicht aufruft. Die Pipeline endet an dieser Stelle und die Antwort wird an den Client zurückgegeben.

app.Use(async (ctx, next) =>
{
    // IP allowlist check
    var ip = ctx.Connection.RemoteIpAddress?.ToString();
    var allowed = new[] { "127.0.0.1", "::1", "10.0.0.0/8" };

    if (!IsAllowed(ip, allowed))
    {
        ctx.Response.StatusCode = 403;
        await ctx.Response.WriteAsJsonAsync(
            new { error = "Access denied from this IP" });
        return; // short-circuit
    }

    await next(ctx); // proceed
});

ShortCircuit() in .NET 8

In .NET 8 bieten MapShortCircuit und die ShortCircuit()-Erweiterung für Endpunkte einen deklarativen und hochoptimierten Pfad zum vorzeitigen Beenden.

// Reject known bad paths immediately — skip entire pipeline
app.MapShortCircuit(404, "robots.txt", "favicon.ico");

// Or on a specific endpoint:
app.MapGet("/health", () => "OK")
   .ShortCircuit(); // skips auth, rate limiting, etc.

// 'Run' middleware also short-circuits:
app.Map("/old-api", old =>
    old.Run(ctx =>
    {
        ctx.Response.StatusCode = 301;
        ctx.Response.Headers.Location = "/api/v2";
        return Task.CompletedTask;
    }));

Terminale Middleware gegenüber Endpunkt-Routing

Vor .NET 3 war app.Run() die einzige terminale Option. Jetzt wird Endpunkt-Routing (MapGet, MapControllers) bevorzugt, da es an Autorisierung, Ratenbegrenzung und Metadaten beteiligt ist.

// OLD: terminal middleware
app.Run(async ctx => {
    if (ctx.Request.Path == "/ping")
        await ctx.Response.WriteAsync("pong");
});

// PREFERRED: endpoint routing
app.MapGet("/ping", () => "pong")
   .WithTags("Health")
   .AllowAnonymous()
   .RequireRateLimiting("basic");

Besonderheiten der Pfadzuordnung

Map("/api") ordnet /api und /api/anything zu. Der übereinstimmende Pfad wird innerhalb des Zweigs aus Request.Path entfernt und in Request.PathBase abgelegt.

app.Map("/api", apiApp =>
{
    apiApp.Use(async (ctx, next) =>
    {
        // Path in branch: /users/42 (prefix removed)
        Console.WriteLine(ctx.Request.Path);     // /users/42
        Console.WriteLine(ctx.Request.PathBase); // /api
        await next(ctx);
    });
    apiApp.MapGet("/users/{id}", (int id) => id);
});

Verzweigungsmuster kombinieren

Reale Anwendungen kombinieren Map, UseWhen und vorzeitige Abbrüche zu mehrschichtigen Pipelines: Öffentliche Routen sind schlank, API-Routen verfügen über Authentifizierung und Admin-Routen über zusätzliche Prüfungen.

// Public area — no auth
app.Map("/public", pub =>
{
    pub.MapGet("/health", () => "OK");
    pub.MapGet("/docs",   () => "Documentation");
});

// API area — full auth + rate limiting
app.Map("/api", api =>
{
    api.UseAuthentication();
    api.UseAuthorization();
    api.UseRateLimiter();
    api.MapControllers();
});

// Admin area — require admin role
app.Map("/admin", admin =>
{
    admin.UseAuthentication();
    admin.UseAuthorization();
    admin.MapControllers().RequireAuthorization("AdminPolicy");
});

Praxisbeispiel: A/B-Testing-Middleware

Eine A/B-Testing-Middleware leitet Anfragen anhand eines Cookies oder Headers an unterschiedliche Handler weiter, ohne den Endpunktcode zu ändern.

app.UseWhen(
    ctx => ctx.Request.Cookies.TryGetValue("ab-group", out var g) && g == "B",
    betaApp =>
    {
        betaApp.Use(async (ctx, next) =>
        {
            ctx.Items["IsGroupB"] = true;
            await next(ctx);
        });
    });

// Endpoint reads the flag:
app.MapGet("/products", (HttpContext ctx, ProductService svc) =>
{
    bool isB = ctx.Items.ContainsKey("IsGroupB");
    return isB ? svc.GetNewLayoutAsync() : svc.GetOldLayoutAsync();
});

Kurztest

Was ist der entscheidende Unterschied zwischen MapWhen und UseWhen?

Zusammenfassung: Vorzeitiges Beenden und Verzweigungen

Wichtige Erkenntnisse:

  • Map: dauerhafte pfadbasierte Verzweigung (keine Rückkehr)
  • MapWhen: dauerhafte prädikatbasierte Verzweigung
  • UseWhen: bedingte Verzweigung mit Rückkehr in die Hauptpipeline
  • Vorzeitiges Beenden: next nicht aufrufen, Antwort schreiben und zurückkehren
  • ShortCircuit() (.NET 8): deklarative, optimierte terminale Endpunkte
  • Kombinieren Sie Verzweigungen, um mehrschichtige Pipelines für öffentliche, API- und Admin-Routen zu erstellen
Kostenlos starten

Lerne C# mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
93
Lektionen
346

Häufig gestellte Fragen

Ist die Lektion „Kurzschließen und Verzweigen“ kostenlos?

Ja — der vollständige Text von „Kurzschließen und Verzweigen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Kurzschließen und Verzweigen“?

Verwenden Sie MapWhen, UseWhen und terminierende Middleware, um die Pipeline abhängig von Anfragebedingungen zu verzweigen oder zu beenden. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C# Academy zu starten?

Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Kurzschließen und Verzweigen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?

Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Überblick über die ASP.NET-Core-Pipeline
  2. Benutzerdefinierte Middleware schreiben
  3. Kurzschließen und Verzweigen
  4. Reihenfolge und integrierte Middleware
← Zurück zu C# Academy