Perdre L'État De La Session
J'ai un ASP.net application où les utilisateurs ne sont pas en mesure de terminer avec succès certaines actions, pour des raisons, je suppose, ne peut être liée à la perte de leur session (qui est l'endroit où je maintiens leurs informations utilisateur actuelles, et comment déterminer s'ils sont connectés)
Je ne sais pas pourquoi ils perdraient leur session, donc ma première question Est:
Ce qui (en général) causerait à un utilisateur de perdre sa session dans ASP.net?
Et puisque je ne sais pas quand un utilisateur perd sa session et ne peut pas la reproduire moi-même:
Comment puis-je suivre quand j'ai de l'utilisateur perd sa session
Voici ma configuration sessionState pour référence
<sessionState
mode="InProc"
cookieless="false"
cookieName="My.Site.Com"
timeout="480"/>
7 réponses
Un certain nombre de choses peuvent provoquer la disparition mystérieuse de l'état de la session.
- votre délai d'attente sessionState a expiré
- vous mettez à jour votre site 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 de manière proactive votre AppDomain pour recompiler et préserver la mémoire.
-
Si vous utilisez IIS 7 ou 7.5, voici quelques choses à regarder au lieu de:
- par défaut, IIS définit AppPools pour s'éteindre après une période d'inactivité.
- par défaut, IIS définit AppPools à recycler toutes les 1740 minutes (évidemment en fonction de votre configuration racine, mais c'est la valeur par défaut)
- dans IIS, consultez les "paramètres avancés" de votre AppPool. C'est une propriété appelée "délai d'Inactivité". Définissez-le sur zéro ou sur un nombre supérieur à la valeur par défaut (20).
- dans IIS, vérifiez les paramètres "recyclage" de votre AppPool. Ici vous pouvez activer ou désactiver le recyclage de votre AppPool. La 2ème page de L'Assistant est un moyen de se connecter au journal des événements de chaque type D'AppPool arrêté.
Si vous utilisez IIS 6, les mêmes paramètres s'appliquent (pour la plupart, mais avec des façons différentes d'y accéder), mais les amener à enregistrer les recyclages est plus pénible. Voici un lien vers un moyen D'obtenir IIS 6 pour enregistrer les événements AppPool recycle:
-
Si vous mettez à jour des fichiers sur votre application web, vous devez vous attendre à ce que toute la session soit perdue. C'est juste la nature de la bête. Cependant, vous ne pouvez 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 plusieurs redémarrages sur une période de temps comme ces pages sont recompilé par les utilisateurs accédant au site. Voir ces deux liens:
Http://support.microsoft.com/kb/319947
Définir numCompilesBeforeAppRestart sur un nombre plus élevé (ou faire rebondir manuellement votre AppPool) éliminera ce problème.
-
Vous pouvez toujours gérer Application_SessionStart et Application_SessionEnd pour être averti lorsqu'une session est créée ou terminé. La classe HttpSessionState a également une propriété IsNewSession que vous pouvez vérifier sur n'importe quelle demande de page pour déterminer si une nouvelle session est créée pour l'utilisateur actif.
-
Enfin, si c'est possible dans votre situation, j'ai utilisé le mode de session SQL Server avec un bon succès. Ce n'est pas recommandé si vous stockez une grande quantité de données (chaque requête charge et enregistre la totalité des données de SQL Serveur) et cela peut être pénible si vous y mettez 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 que mes utilisateurs n'ont jamais remarqué le fait que leur Session en mémoire a été supprimée par un recyclage AppPool car tout leur état a été stocké dans SQL Server.
J'avais une situation dans ASP.NET 4.0 où ma session serait réinitialisée sur chaque demande de page (et mon code SESSION_START s'exécuterait sur chaque demande de page). Cela n'arrivait pas à tous les utilisateurs pour chaque session, mais cela arrivait généralement, et quand c'était le cas, cela se produisait à chaque demande de page.
Ma toile.config balise sessionState avait le même paramètre que celui mentionné ci-dessus.
cookieless="false"
Quand je l'ai changé pour ce qui suit...
cookieless="UseCookies"
... le problème semblait disparaître. Apparemment vrai / faux étaient de vieux choix de ASP.NET 1. À partir de ASP.Net 2.0, les choix énumérés ont commencé à être disponibles. Je suppose que ces options étaient obsolètes. La valeur" false " n'a jamais présenté de problème dans le passé - je n'ai remarqué que dans on ASP.NET 4.0. Je ne sais pas si quelque chose a changé dans 4.0 qui ne le supporte plus correctement.
Aussi, je viens de découvrir cela il n'y a pas longtemps. Puisque le problème était intermittent auparavant, je suppose que je pouvais encore le rencontrer, mais jusqu'à présent il travaille avec ce nouveau paramètre.
Votre session est perdue becoz....
J'ai trouvé un scénario où la session est perdue-dans un asp.net page, pour un champ de zone de texte montant a des caractères non valides, et suivie d'une récupération de variable de session à d'autres fins.Après avoir posté le nombre invalide parsing via Convert.ToInt32 ou double déclenche une exception de première chance, mais l'erreur ne s'affiche pas à cette ligne, au lieu de cela, la Session étant nulle en raison d'une exception non gérée, affiche une erreur lors de la récupération de la session, trompant ainsi le débogage...
Astuce: Testez votre système pour qu'il échoue-destructeur.. entrez assez de pourriels dans des scénarios non liés par exemple: après les résultats de la recherche affichés, entrez les pourriels dans les critères de recherche et accédez aux détails du résultat de la recherche... , vous seriez en mesure de reproduire cette machine sur votre base de code local aussi...:)
J'espère que ça aide, hydtechie
Dans mon cas, définir AppPool- > AdvancedSettings - >processus de travail Maximum à 1 aidé.
Vous pouvez ajouter une journalisation au Global.asax dans Session_start et Application_Start pour suivre ce qui se passe avec la Session de l'utilisateur et l'Application dans son ensemble.
Faites également attention à l'exécution en mode batterie de serveurs Web (plusieurs threads IIS définis dans le pool d'applications) ou à l'équilibrage de charge, car l'utilisateur peut toucher un serveur différent qui n'a pas la même mémoire. Si tel est le cas, vous pouvez basculer le mode de Session sur SQL Server.
Je perdais seulement la session qui n'était pas une chaîne ou un entier mais un datarow. Mettre les données dans un objet sérialisable et l'enregistrer dans la session a fonctionné pour moi.
A eu un problème sur IIS 8 lors de la récupération de contenu via Ajax. Le problème était que MaximumWorkerProcesses
était défini sur 2
et Javascript a ouvert 17 requêtes simultanées. C'était plus que ce que L'AppPool pouvait gérer et un nouveau pool (sans auth-data) a été ouvert.
La Solution était de changer MaximumWorkerProcesses
en 0
dans IIS -> Server -> Application Pools -> [myPool] -> Advanced Settings -> Process Model -> MaximumWorkerProcesses
.