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 que je sais quel est le problème:
- Notre configuration est de 2 x serveurs Web à charge équilibrée + base de données d'état de session unique.
- Le stockage d'état de session SQL ASP.NET semble dépendre de l'ID d'instance de 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 de site Web IIS du site Web est différent sur chacun des serveurs actifs (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 être envoyée à l'un ou l'autre des serveurs.
Par conséquent, lorsqu'un utilisateur se connecte au site et se déplace, chaque appel HTTP peut aller vers l'un des serveurs Web et donc utiliser un enregistrement d'état de session avec des ID différents selon le serveur. En effet, l'utilisateur aurait simultanément 2 instances de session distinctes. Je crois que je l'ai vérifié car dans la table ASPStateTempSessions de la base de données , chaque ID de cookie de session semble correspondre à 2 enregistrements nommés de façon presque identique (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éée à quelques secondes d'intervalle.
Par conséquent, l'état de la session semblera mal se comporter, car les modifications apportées à un enregistrement de session ne persisteront que sur ce serveur Web. Si l'utilisateur se déplace vers l'autre serveur à charge équilibrée, les valeurs de session semblent disparaître ou revenir.
Je crois que la solution est de synchroniser les ID d'instance IIS des sites (par exemple, les faire tous les deux / W3SVC / 1 / Root ), mais j'ai essayé de modifier cette valeur dans IIS sous Paramètres avancés, et bien qu'elle ait enregistré OK, elle a juste fait la le site renvoie 404 sur ce serveur jusqu'à ce que je le remette en place.
J'ai trouvé un script VBS pour ce problème, mais il semble ne concerner que IIS 6, je suis donc inquiet de l'essayer. Quelqu'un d'autre a-t-il rencontré cette situation sur IIS 7.5 et comment l'avez-vous corrigé?
EDIT / SOLUTION
Mon erreur est que j'ai oublié de redémarrer IIS après avoir modifié l'ID d'instance de site dans IIS. Après cela, l'ID a été mis à jour et les sessions ASP.NET ont été synchronisées sur les deux serveurs Web.
Instructions complètes:
- Bureau à distance sur le serveur LIVE1, ouvrez IIS Mgr, cliquez sur le site du problème et choisissez Paramètres avancés dans la barre latérale.
- Modifiez l'ID en quelque chose d'unique, par exemple 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 de site est le même que sur LIVE1)
Notez que l'ID de site affecte l'emplacement des fichiers de site, par exemple le dossier du fichier journal deviendrait C:\inetpub\logs\LogFiles\W3SVC10
par exemple.
Notez également que vous pouvez faire ces changements manuellement en éditant le site id attribut dans le fichier de configuration IIS sur chaque serveur: C:\Windows\System32\inetsrv\config\applicationHost.config
. Nécessite des privilèges d'administrateur et nécessite toujours une réinitialisation par la suite.