Un certain nombre de choses peuvent entraîner la disparition mystérieuse de l'état de la session.
- Le délai de votre sessionState a expiré
- Vous mettez à jour votre web.config ou autre type de fichier qui provoque le recyclage de votre AppDomain
- Votre AppPool dans IIS recycle
- Vous mettez à jour votre site avec beaucoup de fichiers, et ASP.NET détruit proactivement votre AppDomain pour recompiler et préserver la mémoire.
-
Si vous utilisez IIS 7 ou 7.5, voici quelques éléments à vérifier :
- Par défaut, IIS configure les AppPools pour qu'ils se désactivent après une période d'inactivité.
- Par défaut, IIS configure les AppPools pour qu'ils se recyclent toutes les 1740 minutes (cela dépend évidemment de votre configuration Root, mais c'est la valeur par défaut).
- Dans IIS, vérifiez les "Paramètres avancés" de votre AppPool. Il y a une propriété appelée "Idle Time-out". Définissez-la à zéro ou à un nombre plus élevé que la valeur par défaut (20).
- Dans IIS, vérifiez les paramètres de "Recyclage" de votre AppPool. Ici vous pouvez activer ou désactiver le recyclage de votre AppPool. La deuxième page de l'assistant est un moyen de consigner dans le journal des événements chaque type d'arrêt de l'AppPool.
Si vous utilisez IIS 6, les mêmes paramètres s'appliquent (pour la plupart, mais avec des moyens différents d'y accéder), mais il est plus difficile de les amener à enregistrer les recyclages. Voici un lien vers une méthode permettant à IIS 6 d'enregistrer les événements de recyclage d'AppPool :
http://web.archive.org/web/20100803114054/http://surrealization.com/sample-code/getnotifiedwhenapppoolrecycles/
-
Si vous mettez à jour des fichiers sur votre application web, vous devez vous attendre à ce que toutes les sessions soient perdues. C'est la nature même de la bête. Cependant, vous ne devez pas vous attendre à ce que cela se produise plusieurs fois. Si vous mettez à jour 15 fichiers ou plus (aspx, dll, etc.), il est probable que vous aurez de multiples redémarrages sur une période donnée, car ces pages sont recompilées par les utilisateurs qui accèdent au site. Voir ces deux liens :
http://support.microsoft.com/kb/319947
http://msdn.microsoft.com/en-us/library/system.web.configuration.compilationsection.numrecompilesbeforeapprestart.aspx
En fixant le numCompilesBeforeAppRestart à un nombre plus élevé (ou en faisant rebondir manuellement votre AppPool), vous éliminerez ce problème.
-
Vous pouvez toujours gérer Application_SessionStart et Application_SessionEnd pour être informé de la création ou de la fin d'une session. La classe HttpSessionState possède également une classe IsNewSession que vous pouvez vérifier à chaque demande de page pour déterminer si une nouvelle session est créée pour l'utilisateur actif.
-
Enfin, si c'est possible dans votre cas, j'ai utilisé l'outil d'évaluation de la qualité de l'eau. Mode de session du serveur SQL avec un bon succès. Ce n'est pas recommandé si vous y stockez une grande quantité de données (chaque requête charge et sauvegarde la totalité des données du serveur SQL) et cela peut être pénible si vous y placez des objets personnalisés (car ils doivent être sérialisables), mais cela m'a aidé dans un scénario d'hébergement partagé où je ne pouvais pas configurer mon AppPool pour ne pas recycler quelques heures. Dans mon cas, j'ai stocké des informations limitées et cela n'a eu aucun effet négatif sur les performances. Ajoutez à cela le fait qu'un utilisateur existant réutilisera son SessionID par défaut et mes utilisateurs n'ont jamais remarqué que leur session en mémoire avait été abandonnée par un recyclage AppPool parce que tout leur état était stocké dans le serveur SQL.
7 votes
Tu penses peut-être trop fort. Vous avez déclaré que vous "supposez" que la session est perdue. Il est possible qu'il s'agisse d'une chasse à l'oie sauvage. Peut-être feriez-vous mieux d'analyser l'exception que vous recevez et d'en tenir compte. D'autres possibilités incluent des problèmes liés à l'utilisation d'une ferme web ou d'un cluster. Comme le mode de session est "InProc", si les connexions changent de serveur, l'état de la session sera perdu.
0 votes
Je sais que je n'utilise pas une ferme web, mais je suis sur une machine virtuelle. Il est vrai que je ne fais que supposer, mais je suis sûr à 80 % que c'est l'état de la session, et j'aimerais au moins continuer à supposer que c'est un problème jusqu'à ce que je puisse l'exclure.
1 votes
Pour moi, cela a fonctionné pour ajouter une clé de machine à mon web.config. Je suis hébergé sur un hébergement mutualisé et ce lien m'a aidé à créer une clé locale puis à la publier. enlace