.Net Core – Tache planifiée avec Hangfire

Hangfire ?

Hangfire est une solution pour intégrer une gestion de taches de fond / planifiées dans des applications .Net et .Net Core. Le stockage est persisté en base de données, le code est open source et l’utilisation commerciale est gratuite.

Je m’en suis servi sur un projet, la prise en main est facile et cela fait le boulot.

Installation

Install-Package Hangfire

Configuration

Dans le fichier Startup.cs

public void ConfigureServices(IServiceCollection services)
{
        // Add Hangfire
        services.AddHangfire(config =>
                config.UseSqlServerStorage(Configuration["ConnectionStrings:DefaultConnection"]));
        services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
        // Configure Hangfire
        app.UseHangfireDashboard();
        app.UseHangfireServer();

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

Hangfire - Base SQL

Restreindre l’accès au tableau de bord

Le tableau de bord permet de suivre l’exécution des taches planifiées mais aussi de les supprimer ou modifier. Il faut donc limiter les accès.

Hangfire - Dashboard

Solution de facilité, la lecture seule. On peut aussi changer l’URL vers le tableau de bord.

app.UseHangfireDashboard("/scheduler", new DashboardOptions
{
    IsReadOnlyFunc = (DashboardContext context) => true
});

Solution sécurisée

using Hangfire.Dashboard;

public class AdminAuthorizationFilter : IDashboardAuthorizationFilter
{
        public bool Authorize(DashboardContext context)
        {
            var httpContext = context.GetHttpContext();
            return httpContext.User.IsInRole(Constants.Roles.Admin);
        }
}

// dans Startup.Configure()
app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
    Authorization = new [] { new AdminAuthorizationFilter() }
});

Création d’une tache

La documentation explique clairement comment créer une tache et surtout les différents types de taches possibles :

https://docs.hangfire.io/en/latest/background-methods/index.html

Logging

A partir de Hangfire 1.3.0, il n’y a plus rien à faire si l’application utilise l’une des bibliothèques suivantes (merci la réflexion). L’implémentation du logging est automatiquement choisie en vérifiant la présence des types correspondants en respectant l’ordre suivant :

  1. Serilog
  2. NLog
  3. Log4Net
  4. EntLib Logging
  5. Loupe
  6. Elmah

Références :

http://docs.hangfire.io/