0Pricing
C# Academy · Leçon

Court-circuitage et branchement

Utilisez MapWhen, UseWhen et des intergiciels terminaux pour créer des branches ou interrompre la chaîne de traitement selon les conditions de la requête.

Court-circuitage et branchement est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 4 leçons au total.

Branchement et interruption anticipée

Toutes les requêtes ne doivent pas traverser l’intégralité de la chaîne de traitement des intergiciels. ASP.NET Core fournit des outils pour créer des branches, en dirigeant certains sous-ensembles vers d’autres chaînes de traitement, et pour interrompre le traitement, en l’arrêtant et en renvoyant immédiatement une réponse.

Map : branchement permanent selon le chemin

Map crée une branche permanente : les requêtes correspondant au préfixe entrent dans la branche et ne reviennent jamais dans la chaîne de traitement principale (NEVER).

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 : branchement selon un prédicat

MapWhen crée une branche selon n’importe quelle condition, comme des en-têtes, des paramètres de requête ou une logique personnalisée. Comme avec Map, la branche est permanente : elle ne rejoint pas la chaîne de traitement principale.

// 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 : branchement conditionnel qui rejoint la chaîne principale

UseWhen ressemble à MapWhen, mais la branche rejoint la chaîne de traitement principale une fois son exécution terminée. Vous pouvez ainsi ajouter des intergiciels conditionnellement sans créer de branche définitive.

// 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();

Interrompre le traitement sans appeler le suivant

N’importe quel intergiciel peut interrompre la chaîne de traitement en écrivant la réponse sans appeler next. Le traitement s’arrête à cet endroit et la réponse est renvoyée au client.

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() dans .NET 8

Dans .NET 8, MapShortCircuit et la méthode d’extension ShortCircuit() sur les points de terminaison fournissent un chemin d’interruption déclaratif et hautement optimisé.

// 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;
    }));

Intergiciel terminal et routage des points de terminaison

Avant .NET 3, app.Run() était la seule option terminale. Désormais, le routage des points de terminaison, avec MapGet et MapControllers, est privilégié : il participe à l’autorisation, à la limitation du débit et à la gestion des métadonnées.

// 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");

Nuances de mise en correspondance des chemins

Map("/api") correspond à /api et à /api/anything. Le chemin correspondant est supprimé de Request.Path dans la branche et placé dans Request.PathBase.

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);
});

Combiner les schémas de branchement

Les applications réelles combinent Map, UseWhen et les interruptions anticipées pour créer des chaînes de traitement à plusieurs niveaux : les routes publiques sont légères, les routes d’API utilisent l’authentification et les routes d’administration appliquent des contrôles supplémentaires.

// 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");
});

En pratique : intergiciel de tests A/B

Un intergiciel de tests A/B dirige les requêtes vers différents gestionnaires selon un cookie ou un en-tête, sans modifier le code des points de terminaison.

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();
});

Vérification rapide

Quelle est la différence essentielle entre MapWhen et UseWhen ?

Récapitulatif : interruption anticipée et branchement

Points clés à retenir :

  • Map : branchement permanent selon le chemin, sans rejoindre la chaîne principale
  • MapWhen : branchement permanent selon un prédicat
  • UseWhen : branchement conditionnel qui rejoint la chaîne de traitement principale
  • Interruption anticipée : n’appelez pas next, écrivez la réponse et retournez-la
  • ShortCircuit() (.NET 8) : points de terminaison terminaux, déclaratifs et optimisés
  • Combinez les branchements pour créer des chaînes de traitement à plusieurs niveaux : public, API et administration

Questions Fréquemment Posées

La leçon « Court-circuitage et branchement » est-elle gratuite ?

Oui — le texte complet de « Court-circuitage et branchement » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Court-circuitage et branchement » ?

Utilisez MapWhen, UseWhen et des intergiciels terminaux pour créer des branches ou interrompre la chaîne de traitement selon les conditions de la requête. Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer C# Academy ?

Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Court-circuitage et branchement » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?

Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Vue d’ensemble de la chaîne ASP.NET Core
  2. Écrire des intergiciels personnalisés
  3. Court-circuitage et branchement
  4. Ordre des intergiciels et intergiciels intégrés
← Retour à C# Academy