Les middlewares en ASP.NET Core 1.0

Qu'est-ce qu'un middleware ?

Dans le cadre d'une application ASP.NET Core 1.0, les middlewares composent la chaine de traitement (le pipeline) des requêtes HTTP. Ils interagissent sur la réponse et la requête HTTP.

Chaque middleware peut appeler le middleware suivant. Ils peuvent effectuer des opérations avant ET après leur successeur.

Il est essentiel de comprendre que la réponse HTTP se construit uniquement lors du passage de la requête dans cette suite de middleware.

Ainsi dans un Startup classique en ASP.NET Core, on utilise simplement les middlewares par défaut du framework.

Dans l'exemple ci-dessus, on fait donc appel à trois middlewares de base. Le premier d'entre eux a pour rôle de servir les fichiers statiques de notre application. Il va donc regarder si la route demandée correspond à un ficher dans notre dossier wwwroot. Si tel est le cas, alors il l'envoie au client, sinon il passe la main au middleware suivant. Le deuxième va nous permettre d'utiliser Identity afin de gérer les autorisations de notre application. Selon sa configuration, celui-ci va donc regarder les cookies ou/et headers HTTP afin de s'assurer qu'un utilisateur correspond à la requête envoyée. Enfin, le dernier middleware présent ici va ajouter la stack MVC à notre projet.

L'ordre de déclaration de ces middleware dans la méthode Startup de notre application, va définir l'ordre dans lequel les middlewares seront chainés lors du traitement d'une requête.

Dans l'exemple ci-dessus, on peut voir que l'ordre de déclaration correspond bien à l'ordre de passage de la requête au sein des middleware. De plus, on voit instinctivement comment les middlewares peuvent effectuer des actions APRÈS avoir fait appel à leurs successeurs dans la pipeline.

Avec cette information en tête, on peut remarquer le middleware pour les fichiers statiques est situé avant le middleware Identity dans la configuration de base d'ASP.NET Core. Ce choix a été fait pour améliorer les performances. En effet, pour les requêtes sur les fichiers statiques, aucune vérification n'est faite quant aux clients demandant ces ressources.

Comment créer un middleware

La création d'un middleware est vraiment très simple. L'interface IApplicationBuilder met à notre disposition trois méthodes pour le faire.

La plus commune est la méthode Use. Cette méthode prend un delegate avec en entrée : le context HTTP et une méthode de callback vers le middleware suivant. Il est intéressant de noter que nous pouvons continuer à écrire du code après le retour du middleware suivant.

La deuxième méthode de IApplicationBuilder permettant de créer des middlewares est Run. Cette méthode est en fait la même que Use, si ce n'est qu'elle ne nous permet pas d'appeler le middleware suivant. C'est donc cette méthode qu'on va utiliser pour le Middleware en bout de pipeline.

Enfin, la dernière méthode pour créer un middlewares est Map. Celle-ci va permettre de créer un ou plusieurs middlewares qui ne vont s'exécuter que sur une route prédéfinie.

Classe dédiée pour les middlewares

Dans tous mes exemples précédents, j'ai déclaré mes middlewares de manière inline car ils étaient très simples. Pour des middlewares plus complexes, il est préférable de passer par des classes dédiées. Pour cela il est nécessaire de respecter une signature particulière.

Premièrement, la classe doit contenir une méthode Invoke prenant en paramètre un HTTPContext et retournant une Task. De plus, notre classe doit posséder un constructeur avec au moins un paramètre permettant de faire appel au middleware suivant (la méthode next). Celui-ci est de type RequestDelegate. Cependant, le constructeur peut disposer d'autres paramètres. Ces paramètres lui seront passés lors de l'ajout du middleware dans le pipeline HTTP. Cet ajout s'effectue via la méthode UseMiddleware.


Pour conclure, je dirais que les middlewares sont vraiment l'outil idéal pour toute opération devant s'exéctuer sur chaque requête HTTP. En effet, il est extrêmement simple d'ajouter un header custom, ou encore logger les requêtes sur certaines routes etc...

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus