Problème d'état de session ASP.NET du serveur Web IIS 7.5 à équilibrage de charge

14

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:

  1. Notre configuration est de 2 x serveurs Web à charge équilibrée + base de données d'état de session unique.
  2. 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.
  3. 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).
  4. 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:

  1. 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.
  2. Modifiez l'ID en quelque chose d'unique, par exemple 10. Cliquez sur OK.
  3. 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\W3SVC10par 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.

James McCormack
la source

Réponses:

11

À en juger par votre question, il semble que vous ayez un serveur d'état de session central (DB?) Qui garde une trace des données de session?

Vous devez également synchroniser la clé machine utilisée pour le chiffrement pour que l'authentification par formulaire, etc. fonctionne. Cela pourrait également affecter l'identification de la session, je ne suis pas sûr.

Configuration des clés de machine dans IIS 7

De plus, vous devez utiliser la configuration partagée entre les machines, cela pourrait résoudre le problème avec différentes clés de machine.

Synchronisation de la configuration IIS pour la batterie de serveurs Web?

EDIT: lorsque vous avez modifié l'ID de site, avez-vous essayé de redémarrer le gestionnaire IIS pour voir si la racine Web avait changé? Peut-être que la configuration est connectée à l'ID, ce qui signifie qu'un changement d'ID modifie également des éléments comme la racine du document, etc.

jishi
la source
Merci pour les idées Jishi mais j'avais déjà synchronisé la machineKey dans le web.configs. Je suppose que je cherche vraiment un moyen de changer l'ID d'instance IIS d'un site sans avoir à supprimer complètement et à reconfigurer les sites sur les serveurs Web.
James McCormack
Lorsque vous avez modifié l'ID du site, avez-vous essayé de redémarrer le gestionnaire IIS pour voir si la racine Web avait changé? Peut-être que la configuration est connectée à l'ID, ce qui signifie qu'un changement d'ID modifie également des éléments comme la racine du document, etc.
jishi
1
Oui, c'était ça! J'ai oublié de redémarrer le service IIS (ligne de commande iisreset / restart). A bien fonctionné après ça! Veuillez mettre à jour votre réponse avec ces informations et je vous donnerai la réponse acceptée.
James McCormack
Terminé. Heureux que cela ait fonctionné pour vous.
jishi