Featured image of post Dotnet 8.0 : ShortCircuit ou comment bypass la middleware pipeline

Dotnet 8.0 : ShortCircuit ou comment bypass la middleware pipeline

Première étape, télécharger le Dotnet 8.0 SDK https://dotnet.microsoft.com/en-us/download/dotnet/8.0

Lorsque l’on crée une Api ASPNet Core, en utilisant le template standard, voilà ce que l’on obtient :

var builder = WebApplication.CreateBuilder(args) ;
// Add services to the container.
builder. Services .AddControllers);
// Learn more about configuring Swagger/OpenAPI at https: //aka.ms/aspnetcore/swashbuckle
builder. Services .AddEndpointsApiExplorer);
builder. Services .AddSwaggerGen();
var app = builder. Build);
// Configure the HTTP request pipeline.
if (app. Environment. IsDevelopment ())
{
   app. UseSwagger;
   app. UseSwaggerUI();
}
app. UseHttpsRedirection();
app. UseAuthorization;
app. MapControllers) ;
app. Run ();

Pour faire simple la partie builder se charge de l’injection de dépendance, et le app.X se charge de créer les middleware dans la pipeline. Attention l’ordre a son importance.

petit rappel de l’exécution de la pipeline, les middleware s’exécutent dans l’ordre de leur déclaration “App.UseX” :

Pour notre exemple je vais ajouter une route “DummyRoute” ainsi qu’un middleware pour illustrer l’exécution de base.

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.UseMiddleware<DummyMiddleware>();

app.MapGet("DummyRoute", () =>
{
    Console.WriteLine("DummyRoute is triggered");
    Results.Ok();
})

app.Run();

Le Middleware quand a lui, ne fera qu’écrire une ligne dans la console :

public class DummyMiddleware
    {
        private readonly RequestDelegate _next;

        public DummyMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task InvokeAsync(HttpContext context)
        {
            Console.WriteLine(context.Request.Path);
            Console.WriteLine("Then Dummy Middleware is invoked");
            await _next(context);
        }
    }

Des lors qu’on lance notre Api et qu’on trigger la route : https://localhost:5102/DummyRoute on voit bien que le Middleware est invoqué. “The Dummy Middleware is invoked”

Comment bypasser, les midlware ? il suffit de modifier le MapGet de la sorte en ajoutant ShortCircuit() :

app.MapGet("DummyRoute", () =>
{
    Console.WriteLine("DummyRoute is triggered");
    Results.Ok();
}).ShortCircuit();

Maintenant appelons la route /WeatherForecast :

On constate bien que le middleware est invoqué.

Appelons la route /DummyRoute

On constate une entrée dans la console “Dummy Route is triggerd”, mais aucune invocation du middleware, ce qui montre bien que l’on bypass bien la pipeline. Chez vous, il suffit d’ajouter un breakpoint dans le middleware et voir que ca break ou non en fonction de la route que vous appelez.

En Conclusion

Bypasser la middleware pipeline peut s’avérer très utile pour des questions de performance. En général ca va s’appliquer a des use cases ou l’on a pas besoin de traverser celle-ci. Par exemple une route de type “HealthCheck”’. On peut aussi configurer le bypass de manière globale, si votre API sert des fichiers static 404.html, favicon.ico, sitemap.xml ou encore robot.txt voir l’examle ci-dessous.

App.MapShortCircuit("favicon.ico", "robot.txt", "sitemap.xml", 404,"404.html");

Le code sample est disponible sur mon compte GitHub