namespace Webzine.WebApplication.Middlewares { using System.Diagnostics; public class LogTempsExecutionMiddleware { /// /// log à chaque requete http. /// // _next représente le maillon suivant dans la chaîne (le prochain middleware ou le contrôleur) private readonly RequestDelegate next; private readonly ILogger logger; // Le constructeur récupère "_next" et le Logger public LogTempsExecutionMiddleware(RequestDelegate next, ILogger logger) { this.next = next; this.logger = logger; } // méthode appelée à chaque requête HTTP public async Task InvokeAsync(HttpContext context) { // (Avant le contrôleur) var chronometre = Stopwatch.StartNew(); // lance le chrono // C'est ici que le reste de l'application s'exécute (autres middlewares et Contrôleur) await this.next(context); // (Après le contrôleur) chronometre.Stop(); // arrête le chrono var tempsEcoule = chronometre.ElapsedMilliseconds; // écrit dans les logs l'URL de la page et le temps qu'elle a pris var urlPage = context.Request.Path; this.logger.LogInformation($"[MIDDLEWARE] La page {urlPage} a mis {tempsEcoule} ms à charger."); } } }