0Pricing
C# Academy · Leçon

Vue d’ensemble de la chaîne ASP.NET Core

Comprenez comment les requêtes traversent la chaîne de traitement des intergiciels et HttpContext, ainsi que la façon dont les réponses sont construites.

Vue d’ensemble de la chaîne ASP.NET Core est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 1 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.

La chaîne de traitement des requêtes

Chaque requête HTTP dans ASP.NET Core traverse une chaîne de traitement des intergiciels. Chaque intergiciel peut inspecter, modifier, interrompre ou transmettre la requête au composant suivant. Comprendre cette chaîne de traitement est fondamental pour créer des applications ASP.NET Core.

HttpContext : l’enveloppe de la requête

HttpContext contient toutes les informations sur une requête et une réponse : les en-têtes, les cookies, le body, les revendications de l’utilisateur, les informations de connexion et le jeton d’annulation. Tous les intergiciels l’utilisent.

app.Use(async (context, next) =>
{
    // Read request info
    var method  = context.Request.Method;
    var path    = context.Request.Path;
    var headers = context.Request.Headers;
    var user    = context.User.Identity?.Name;

    // Write to response
    context.Response.Headers.Append("X-Processed-By", "MyMiddleware");

    await next(context); // forward to next middleware
});

Ordre d’enregistrement des intergiciels

Les intergiciels s’exécutent dans l’ordre de leur enregistrement. La réponse se déroule dans l’ordre inverse, comme une pile. L’ordre est essentiel : l’authentification doit s’exécuter avant l’autorisation, et le routage avant la mise en correspondance avec un point de terminaison.

// Typical order for an ASP.NET Core app:
app.UseExceptionHandler("/error"); // outermost — catches everything
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCors("policy");
app.UseAuthentication();  // must be before Authorization
app.UseAuthorization();
app.UseRateLimiter();
app.UseOutputCache();
// MapHub, MapControllers, MapGet etc.
app.Run();

Use, Run et Map

Trois méthodes ajoutent des intergiciels : Use appelle le suivant, Run est terminal et n’appelle jamais le suivant, tandis que Map crée une branche selon le chemin.

// Use: passes to next
app.Use(async (ctx, next) =>
{
    Console.WriteLine("Before");
    await next(ctx);
    Console.WriteLine("After");
});

// Run: terminal — no next
app.Run(async ctx =>
    await ctx.Response.WriteAsync("Terminal"));

// Map: branch on path prefix
app.Map("/api", apiApp =>
    apiApp.Run(async ctx =>
        await ctx.Response.WriteAsync("API branch")));

Corps des requêtes et des réponses

Les corps des requêtes et des réponses sont des flux. La lecture du body de la requête ne peut être effectuée qu’une seule fois : activez la mise en mémoire tampon du body de la requête si vous devez le lire plusieurs fois, par exemple dans plusieurs intergiciels.

app.Use(async (ctx, next) =>
{
    // Enable buffering so body can be read multiple times
    ctx.Request.EnableBuffering();

    using var reader = new StreamReader(
        ctx.Request.Body,
        leaveOpen: true);
    var body = await reader.ReadToEndAsync();
    ctx.Request.Body.Position = 0; // rewind for next middleware

    Console.WriteLine($"Body: {body}");
    await next(ctx);
});

Interrompre la chaîne de traitement

Un intergiciel peut interrompre la chaîne de traitement en écrivant la réponse et en évitant d’appeler next (NOT). C’est utile pour les barrières d’authentification, les contrôles d’état ou les pages de maintenance.

app.Use(async (ctx, next) =>
{
    if (ctx.Request.Path == "/maintenance")
    {
        ctx.Response.StatusCode = 503;
        await ctx.Response.WriteAsync("Service under maintenance");
        return; // short-circuit — next is NOT called
    }
    await next(ctx);
});

L’interface IMiddleware

Pour un intergiciel basé sur une classe qui nécessite l’injection de dépendances, implémentez IMiddleware. Enregistrez l’implémentation dans DI et utilisez app.UseMiddleware<T>().

public class RequestTimingMiddleware : IMiddleware
{
    private readonly ILogger<RequestTimingMiddleware> _logger;
    public RequestTimingMiddleware(ILogger<RequestTimingMiddleware> l) => _logger = l;

    public async Task InvokeAsync(HttpContext ctx, RequestDelegate next)
    {
        var sw = System.Diagnostics.Stopwatch.StartNew();
        await next(ctx);
        _logger.LogInformation("{Method} {Path}: {Ms}ms",
            ctx.Request.Method, ctx.Request.Path, sw.ElapsedMilliseconds);
    }
}

// Register:
builder.Services.AddTransient<RequestTimingMiddleware>();
app.UseMiddleware<RequestTimingMiddleware>();

Classes d’intergiciels conventionnelles

Vous pouvez également créer une classe dotée d’une méthode InvokeAsync(HttpContext, RequestDelegate). L’infrastructure injecte les dépendances, y compris le délégué suivant, via le constructeur.

public class ApiKeyMiddleware
{
    private readonly RequestDelegate _next;
    private readonly string _key;

    // RequestDelegate injected by framework
    public ApiKeyMiddleware(RequestDelegate next, IConfiguration cfg)
    {
        _next = next;
        _key = cfg["ApiKey"] ?? "";
    }

    public async Task InvokeAsync(HttpContext ctx)
    {
        if (ctx.Request.Headers["X-Api-Key"] != _key)
        {
            ctx.Response.StatusCode = 401;
            return;
        }
        await _next(ctx);
    }
}

Modifier les réponses après l’appel au suivant

Le code situé après await next(ctx) s’exécute une fois que l’écriture de la réponse a commencé. Vous pouvez ajouter des en-têtes de réponse avant next, mais vous ne pouvez plus modifier le code d’état ni le corps après cet appel.

app.Use(async (ctx, next) =>
{
    // Before: add response headers (safe)
    ctx.Response.OnStarting(() =>
    {
        ctx.Response.Headers.Append("X-Request-Id",
            Guid.NewGuid().ToString("N"));
        return Task.CompletedTask;
    });

    await next(ctx);

    // After: response may already be sent
    // SAFE: logging, metrics
    // UNSAFE: changing status code or writing body
    Console.WriteLine($"Response status: {ctx.Response.StatusCode}");
});

En pratique : intergiciel d’identifiant de corrélation

Un intergiciel d’identifiant de corrélation utilisé en production ajoute un identifiant de trace à chaque requête pour la traçabilité distribuée et la journalisation.

public class CorrelationIdMiddleware
{
    private readonly RequestDelegate _next;
    private const string Header = "X-Correlation-Id";

    public CorrelationIdMiddleware(RequestDelegate next) => _next = next;

    public async Task InvokeAsync(HttpContext ctx)
    {
        var correlationId = ctx.Request.Headers[Header].FirstOrDefault()
            ?? Guid.NewGuid().ToString("N");

        ctx.Items["CorrelationId"] = correlationId;

        ctx.Response.OnStarting(() =>
        {
            ctx.Response.Headers.Append(Header, correlationId);
            return Task.CompletedTask;
        });

        using (Serilog.Context.LogContext.PushProperty("CorrelationId", correlationId))
            await _next(ctx);
    }
}

Vérification rapide

Quelle est la différence entre app.Use() et app.Run() lors de l’ajout d’un intergiciel ?

Récapitulatif : vue d’ensemble de la chaîne ASP.NET Core

Points clés à retenir :

  • Les intergiciels s’exécutent dans l’ordre d’enregistrement ; les réponses se déroulent dans l’ordre inverse
  • Use → appelle le suivant ; Run → terminal ; Map → branchement selon le chemin
  • HttpContext contient la requête, la réponse, l’utilisateur et le jeton d’annulation
  • Activez la mise en mémoire tampon pour lire plusieurs fois le body de la requête
  • L’interface IMiddleware permet de créer des intergiciels basés sur des classes compatibles avec DI
  • Ajoutez des en-têtes de réponse avec OnStarting() ; ne modifiez pas le code d’état après l’appel au suivant

Questions Fréquemment Posées

La leçon « Vue d’ensemble de la chaîne ASP.NET Core » est-elle gratuite ?

Oui — le texte complet de « Vue d’ensemble de la chaîne ASP.NET Core » 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 « Vue d’ensemble de la chaîne ASP.NET Core » ?

Comprenez comment les requêtes traversent la chaîne de traitement des intergiciels et HttpContext, ainsi que la façon dont les réponses sont construites. 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 1 sur 4.

Combien de temps prend la leçon « Vue d’ensemble de la chaîne ASP.NET Core » ?

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