ASP .NET Core MVC – Mesurer la durée d’exécution des requêtes HTTP

Présentation
Dans ASP .NET Core MVC, les middlewares sont des composants permettant d’exécuter du code lors du traitement d’une requête et/ou la réponse HTTP. Dans cet article, je vous propose d’implémenter un middleware personnalisé, dont le rôle est de mesurer les durées d’exécution des requêtes HTTP nécessitant l’exécution d’une action dans un contrôleur.

Mise en œuvre
Pour implémenter ce middleware :

  • Lors du traitement d’une requête HTTP, on stocke la date et l’heure courante dans une variable.
  • Lors du traitement de la réponse HTTP, on calcule la différence entre la date et l’heure courante et la date / heure précédemment stockée.

Ce middleware est implémenté dans la méthode Configure ci-dessous :

public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        // Middleware pour la gestion des erreurs.
        if (env.IsDevelopment())
        {
            // En environnement de développement.
            app.UseDeveloperExceptionPage();
        }
        else
        {
            // En environnement de recette ou de production.
            app.UseExceptionHandler("/Home/Error");
        }

        // Pour permettre l'accès aux fichiers contenus dans le répertoire wwwroot.
        app.UseStaticFiles();

        // Mesurer le temps d'exécution.
        app.Use(async (context, next) =>
        {
            // Exécuté lors du traitement de la requête HTTP.
            DateTime DateHeureDebut = DateTime.Now;

            // Exécution du middleware suivant dans le pipeline.
            await next();

            // Exécuté lors du traitement de la réponse HTTP.
            DateTime DateHeureFin = DateTime.Now;
                TimeSpan DureeExecution = DateHeureFin - DateHeureDebut;

            // Log.
            string Log = $"Durée d'exécution : {DureeExecution.TotalSeconds} secondes";
            // ...
        });

        // Définition des routes.
        app.UseMvc(routes =>
        {
            routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

About: James RAVAILLE

Travaillant avec la plateforme Microsoft .NET depuis 2002, j’alterne les missions de formation et d’ingénierie avec cette plateforme. J’écris ce blog pour transmettre mes connaissances à tout développeur, qu’il soit débutant ou expérimenté.