Utiliser les variables de session avec plusieurs processus de travail

Lors du développement de votre site web, vous serez probablement amenés à utiliser l’objet Session pour y stocker des variables. Et, pour augmenter les performances de votre site, vous pourriez augmenter le nombre de processus de travail dans IIS (Web garden).

Cependant, par défaut, ces deux paramètres sont incompatibles.

En effet, pour résumer de façon simple, on peut dire que les variables de session seront parfois stockées dans l’objet Session de l’un des processus, puis parfois dans l’objet Session d’un autre processus.

Exemple :

MonObjet monObjet = (MonObjet)(Session[MOT_CLE]); // Va être null « une fois sur deux » si vous avez deux processus de travail.

Pour éviter ce problème, il faut changer le mode d'état de session (sessionState) et le mettre en mode « StateServer », puis réaliser quelques opérations supplémentaires.

Augmentation du nombre de processus

Pour se mettre dans la situation décrite précédemment, créez une simple page web, avec par exemple un contrôle serveur Label.

Dans la fonction Page_Load() de cette page, ajoutez les quelques lignes suivantes :

Session["TEST"] = "test test test";
string strTest = (string)Session["TEST"];
lblTest.Text = strTest;

Notez toutefois qu’un processus doit être très sollicité avant de devoir passer la main au second processus.

Maintenant, ouvrez le gestionnaire de services Internet (IIS), sélectionnez les Pools d’application, faites un clic-croit sur le Pool auquel votre site est rattaché (par exemple DefaultAppPool), puis choisissez Paramètres avancés. Dans la section Modèle de processus, augmentez le Nombre maximal de processus de travail, puis redémarrez le Pool d’application.

Pour les utilisateurs de IIS 6.0, l’interface est assez différente, et je vous invite à suivre la documentation de Microsoft pour retrouver cette option.

http://msdn.microsoft.com/fr-fr/library/aa720391(v=vs.71).aspx
http://technet.microsoft.com/fr-fr/library/cc786907(WS.10).aspx

Sur un site à la charge conséquente, vous devriez désormais obtenir le cas de figure décrit précédemment, à savoir des variables de session vides.

Activation du mode StateServer

Par défaut, la Session est gérée par le processus unique de IIS lui-même. Dans notre cas, puisqu’on a plusieurs processus de IIS, on va utiliser un autre serveur (logiciel) dédié à la gestion des sessions. Il s’agit d’une option à activer dans le Web.config du site, mais également d’un service Windows à démarrer.

L’activation de l’option est une opération qui peut se réaliser via l’interface de IIS. Choisissez votre site, puis, dans la section ASP.NET, double-cliquez sur l’icône Etat de session. Par défaut, c’est l’option « Dans le processus » (« InProc ») qui est cochée. Optez pour « Server d’état » (« StateServer »).

Vous obtiendrez alors les lignes suivantes dans le Web.config de votre site :

  <system.web>
        <sessionState mode="StateServer" />
  </system.web>

Pour plus d’informations, voici la documentation de Microsoft :

http://msdn.microsoft.com/fr-fr/library/ms178586.aspx

A présent, il faut démarrer le serveur de session via les Services Windows (Démarrer, Outils d’administration, Services). Cherchez la ligne Service d’état ASP.NET. Mettez le type de démarrage en Automatique (sauf contrindication), et Démarrez le service.

Vous pourrez voir dans le Gestionnaire de tâche qu’un exécutable du nom de « aspnet_state.exe » est désormais en train de tourner.

Sérialisation des objets

Mais ce n’est pas tout. Si vous stockez dans la Session des objets complexes, ces derniers doivent être « sérialisables » (serializable).

Il suffit d’ajouter l’attribut « Serializable » à vos classes susceptibles d’être stockées en session :


[Serializable]
    public class MonObjet
    {
        public MonObjet() { }
    }

C’est un petit changement dans le code, mais qui nécessite tout de même la recompilation du projet, puisque le code des classes est modifié.

Conclusion

C’est terminé ! Après avoir activé le mode StateServer, démarré le service et ajouté l’attribut Serializable à vos classes d’objets, votre site est prêt à être hébergé par plusieurs processus de IIS.

Cette notion de mode d’état de session peut paraître évidente, mais il existe à mon avis un « danger » réel puisque le nombre de processus est tout de même une option avancée, voire cachée, qui peut être modifiée à l’insu des développeurs. Dans le même ordre d’idées, on peut également avoir de mauvaises surprises en passant d’un environnement à un autre…

Enfin, notez qu’en plus du mode « serveur d’état » (StateServer), il existe aussi le mode SQL Server (« SQLServer »), qui, comme son nom l’indique, permet de gérer les sessions via SQL Server. C’est une alternative intéressante à explorer.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.