ASP.net – Mise en place d’un serveur de session – à quoi correspond aspnet_state.exe
Par défaut, ASP.net stocke les sessions au sein de son propre processus, c’est à dire w3wp.exe ou aspnet_wp.exe pour IIS 5.1 et inférieur. Lorsque le pool d’application est recyclé ou redémarré les sessions sont alors perdues. Cela peut rapidement causer quelques soucis : perte de la connexion, perte du panier, ...
Afin de ne plus avoir ce problème, ASP.net propose différents moyens de stocker la session. Ces moyens sont configurables via l’attribut mode de la section system.web/sessionState du web.config. Les différentes valeurs possibles sont :
- Off : Désactive complètement la session. Dans ce cas, une erreur sera remontée si on tente d’accéder à la session.
- InProc : Valeur par défaut, stocke la session au sein du processus courant.
- StateServer : Stocke la session dans un serveur de session. L’adresse du serveur de session se configure via l’attribut stateConnectionString.
- SQLServer : Stocke la session sur un serveur SQL. La chaine de connexion vers le serveur se configure via l’attribut sqlConnectionString.
- Custom : Utilise le type spécifié via l’attribut SessionIDManagerType. Ce type doit implementer ISessionIDManager
Afin d’utiliser le mode StateServer, il est nécessaire de changer le mode de démarrage du service aspnet_state. Ce service est automatiquement installé lorsque l’on installe ASP.net, c’est lui qui stockera la session ASP.net. Une fois lancé, on retrouve le service dans le gestionnaire de tâche sous le nom de aspnet_state.exe
Il faut ensuite modifier le fichier de configuration ainsi :
<configuration>
<system.web>
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" />
</system.web>
</configuration>
Désormais, les sessions sont stockés dans le process aspnet_state.exe et non w3wp.exe.
Par défaut, le serveur de session n’est pas accessible de l’extérieur, si vous utilisez plusieurs serveurs frontaux et que vous voulez monopoliser le serveur de session, il faut modifier la clé de registre suivante :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\aspnet_state\Parameters\AllowRemoteConnection
Si la valeur de cette clé est 0 alors le service windows sera accessible seulement pour la machine local. Sinon, si la valeur est 1, alors le service windows sera accessible depuis d’autres serveurs. Attention, pour des raisons de performances, il n’y pas d’authentification, il faut donc impérativement que ce port ne soit pas visible de l’extérieur.

J’ai déjà parlé plus précisément sur les mécanismes internes des sessions en ASP.net, vous pouvez consulter l’article : “Partager la session entre plusieurs sous-domaines avec http ou https” pour en savoir plus sur les sessions ASP.net
Avez-vous déjà mis en place le serveur de sessions ? Si oui, avez vous rencontrer des soucis particuliers ?