Nous avons un problème avec un site web ASP.NET où les sessions des utilisateurs se comportent bizarrement – les données de session apparaissent, disparaissent et réapparaissent.
Je pense savoir quel est le problème :
-
Notre configuration est 2 serveurs web avec équilibrage de charge + une seule base de données d’état de session.
-
Le stockage d’état de session SQL ASP.NET semble dépendre de l’ID d’instance du site web IIS (ID de la métabase) pour identifier de manière unique l’ID du cookie de session entrant et récupérer/stocker les valeurs.
-
L’ID d’instance du site web IIS est différent sur chacun des serveurs en production (ID /W3SVC/1/Root sur le serveur web A, ID /W3SVC/2/Root sur le serveur web B).
-
L’équilibrage de charge n’utilise pas l’affinité client, donc chaque requête HTTP utilisateur peut aller vers l’un ou l’autre serveur.
Par conséquent, lorsqu’un utilisateur se connecte au site et navigue, chaque appel HTTP peut aller vers l’un ou l’autre serveur web, et donc utiliser un enregistrement d’état de session avec des ID différents selon le serveur. En fait, l’utilisateur aurait simultanément 2 instances de session distinctes. Je crois l’avoir vérifié car dans la table ASPStateTempSessions de la base de données, chaque ID de cookie de session semble correspondre à 2 enregistrements aux noms quasi identiques (leurs ID ne diffèrent que par les derniers caractères, qui je crois sont un modificateur basé sur l’AppID de la table AspStateTempApplications) créés à quelques secondes d’intervalle.
Par conséquent, l’état de session semblera mal se comporter car les modifications apportées à un enregistrement de session ne persisteront que contre ce serveur web. Si l’utilisateur passe à l’autre serveur avec équilibrage de charge, les valeurs de session sembleront disparaître ou revenir en arrière.
Je crois que la solution est de synchroniser les ID d’instance IIS des sites (par ex. les mettre tous les deux à /W3SVC/1/Root), mais j’ai essayé de modifier cette valeur dans IIS sous Paramètres avancés, et bien que la sauvegarde ait fonctionné, cela a simplement fait retourner des 404 pour le site sur ce serveur jusqu’à ce que je remette la valeur d’origine.
J’ai trouvé un script VBS pour ce problème mais il semble être uniquement pour IIS 6 donc j’hésite à l’essayer. Quelqu’un d’autre a-t-il rencontré cette situation sur IIS 7.5, et comment l’avez-vous résolue ?
MODIFICATION / SOLUTION
Mon erreur était que j’avais oublié de redémarrer IIS après avoir changé l’ID d’instance du site dans IIS. Après cela, l’ID a été mis à jour et les sessions ASP.NET étaient synchronisées sur les deux serveurs web.
Instructions complètes :
-
Connectez-vous en Bureau à distance sur le serveur LIVE1, ouvrez le Gestionnaire IIS, cliquez sur le site problématique et choisissez Paramètres avancés dans la barre latérale.
-
Changez l’ID pour quelque chose d’unique, par ex. 10. Cliquez sur OK.
-
Redémarrez le service web (
c:\windows\system32\iisreset /restart)
Faites de même pour LIVE2 (assurez-vous que l’ID du site est le même que sur LIVE1)
Notez que l’ID du site affecte l’emplacement des fichiers du site, par ex. le dossier des fichiers journaux deviendrait C:\inetpub\logs\LogFiles\W3SVC10 par exemple.
Notez également que vous pourriez effectuer ces modifications manuellement en éditant l’attribut id du site dans le fichier de configuration IIS sur chaque serveur : C:\Windows\System32\inetsrv\config\applicationHost.config. Cela nécessite des privilèges administrateur et nécessite toujours un redémarrage ensuite.