9
votes

ASP.NET Perdre de manière aléatoire des valeurs de session

Je cherche des réponses pour un peu de temps à ce sujet, car il continue de me promise. Nous stockons les informations de connexion utilisateur et d'autres données sur les activités actuelles de l'utilisateur dans l'état de session (InProc). De plus, je reçois une exception de référence NULL essayant d'utiliser l'une des variables de session. Cela se produit sur des pages aléatoires, avec des variables de session aléatoires. J'ai modifié les balises Web.config HTTPRuntime et de conforme pour empêcher les redémarrages d'APPLOOL:

Dim runtime As HttpRuntime = GetType(System.Web.HttpRuntime).InvokeMember("_theRuntime", BindingFlags.NonPublic Or BindingFlags.Static Or BindingFlags.GetField, Nothing, Nothing, Nothing)
Dim shutDownMessage As String = runtime.GetType().InvokeMember("_shutDownMessage", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetField, Nothing, runtime, Nothing)

Dim shutDownStack As String = runtime.GetType().InvokeMember("_shutDownStack", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetField, Nothing, runtime, Nothing)
Dim evtSource As String = "ASP.NET"
Dim log As New EventLog
log.Source = evtSource
log.WriteEntry(String.Format("_shutDownMessage={0}{2}_shutDownStack={1}", shutDownMessage, shutDownStack, vbCrLf & vbCrLf), EventLogEntryType.Warning)


5 commentaires

Essayez de rechercher sur Stackoverflow, il y a beaucoup de mêmes questions avec de nombreux conseils.


Exécutez-vous les deux serveurs Web derrière un équilibreur de charge? (Et êtes-vous sûr que vous avez eu un bon contrôle à travers votre code pour savoir où ils sont définis pour être sûr qu'ils ne sont pas écrasés)?


J'ai traversé le code à plusieurs reprises à la recherche d'où je peux vous écraser par inadvertance, mais je ne peux pas trouver un endroit que je suis. En outre, cela se produit sur de nombreuses pages différentes pour différentes sessions vars - et avec différents utilisateurs / navigateurs / plates-formes. Je ne trouve aucune corrélation entre les instances quand cela se produit


Pourrait valoir la peine de vérifier que vous n'avez pas de blocages de capture vides. Si vous essayez d'ajouter à la session un objet qui n'est pas sérialisable (ou celui qui contient un objet imbriqué qui n'est pas sérialisable), il va lancer. Mais si vous attrapez et que vous mangez une exception lancée, vous pourriez vous retrouver dans une situation où vous pensiez avoir ajouté quelque chose à la session, mais cela a échoué tranquillement.


@mikemanne - C'est une bonne pensée, et je vérifierai certainement des objets non-sérialisables si / lorsque je implémente un serveur d'état, mais depuis son inproc, je peux ajouter n'importe quel objet à la session, non seulement des objets sérialisables. C'est l'une des raisons pour lesquelles je n'ai pas encore fait le serveur d'état - il y a tellement d'endroits à parcourir et assurez-vous que tous les objets sont sérialisables ..


6 Réponses :


7
votes

Si votre application Web s'est déployée sur une batterie de serveur (plus d'un serveur Web) Comme vous l'avez dit, vous utilisez une session InProCroC et il peut arriver que l'utilisateur soit redirigé vers un autre serveur de celui où il a été stocké cette variable de session. Dans ce cas, vous devriez choisir une session hors du proc comme que vous avez mentionné (Session State Server)

Si vous optez pour un serveur d'état, ce n'est à l'esprit que vous pouvez éviter tout autre problème:

Étant donné que l'administrateur combine l'ID de session ASP.NET avec l'IIS chemin d'application pour créer une clé unique, des sessions émises pour l'une des Les cinq nouvelles nappes n'ont pas pu être trouvées lorsqu'elles ont accès à travers l'un des d'autres toiles qui sont évidemment extrêmement malheureuses dans un pondéré Round Robin Load Sangled Web Farm

http://www-jo.se/f.pfleger/session-lost < / a>

a également consulté cet enregistreur pour comprendre si l'application recycle contre votre volonté:

http://weblogs.asp.net/scotgu/ Archive / 2005/12/14 / 433194.aspx

http://blogs.msdn.com/b/TESS/ARCHIVE/2006/08/02/ASP-NET-CASE-Study-Situ-Session-Variables-and-appdomain-recycles. ASPX


6 commentaires

C'était aussi ma première pensée. Cependant, comme il a déclaré "lorsque des variables de session particulières sont perdues, la plupart des autres variables de session pour le même utilisateur sont toujours en place.", Je suis moins susceptible de suspecter l'échec de la session-affinité.


cela peut arriver. Peut-être que l'utilisateur était sur le serveur 1 (Disons que peu de variable de session ont été créés) puis si la demande est desservie par le serveur 2 et que le code tente d'accéder à une variable de session qui n'existe pas sur ce serveur, il obtiendra une null. référence


Désolé, j'aurais dû spécifier cela aussi .. Seulement 1 serveur, pas une ferme de serveur


J'ai déjà vu la page Scottgu avant. J'ai utilisé une partie de son code pour gérer la journalisation d'arrêt du pool d'applications - J'ai mis à jour le message original avec ce code. La chose est que je ne pense pas que cela se passe du tout. Tout le monde en ligne reste actif et ne perd pas de valeurs de session. De plus, l'utilisateur qu'il arrive à rester actif (leurs informations utilisateur sont en session) et ont d'autres valeurs de session non affectées.


Essayez également d'utiliser les événements de surveillance de la santé montrés sur le dernier lien au paragraphe "Comment déterminez-vous ce qui a provoqué un redémarrage de l'AppDomain?"


@ Massimiliano - Bon point sur les vieilles sessions potentiellement vivants sur différents serveurs à charge équilibrée. On dirait que c'est discutable pour lui (1 serveur). Mais toujours, je n'ai pas pensé à ça! :)



1
votes

Les problèmes de session que vous êtes confrontés peuvent se produire à cause de plusieurs raisons

  1. expiration de la session: comme vous utilisez le mode INPROCC, les sessions sont Valable uniquement pour la tenie tenace de sessionTimeout. qui est 20 minutes par défaut. Essayez d'utiliser la balise de sessionState dans la section System.Web de votre Web .config et définir la valeur du délai d'attente à une valeur plus grande.

  2. Un autre problème pourrait être à cause de webfarms et de jardins Web. si Vous avez configuré Web Farms Web et Garden Web pour votre site Web. Le partage de session InProCC peut causer des problèmes.

  3. Process Redémarrage: Le processus W3P de votre site Web obtient redémarré en raison d'un problème dans le code. ou fuites de mémoire.


0 commentaires

7
votes

Pour toute personne intéressée ou traitant de problèmes similaires, je voulais faire un suivi avec la cause de mon problème ici.

J'ai implémenté NCache Server d'état hors processus pour le cache d'application et l'état de la session il y a environ 7 ou 8 mois. Malheureusement, le déplacement de la session hors processus n'a eu aucun impact de mon problème de perte de variables de session aléatoire lors de la sélection de rapports sur mon site. Et, comme j'avais été incapable de reproduire ce problème, je n'avais pas mis plus d'effort pour tenter de le réparer jusqu'à récemment quand un autre problème a rendu la lumière dans ma tête.

Pour aller au point - je n'écrase pas les variables de la session quelque part que je ne me suis pas réalisée, mais le problème était l'utilisateur d'ouvrir une seconde (ou une troisième) onglet pour comparer les options de sélection des rapports côte à côte. Nous avons plusieurs rapports personnalisés dans lesquels l'utilisateur peut sélectionner plusieurs options pour générer des rapports personnalisés (pensez-y comme un contrôle de l'assistant où il existe plusieurs étapes pour créer un rapport personnalisé). Si un utilisateur est à l'étape 3 de 5 de 5, puis ouvre une nouvelle onglet et commence à nouveau à traverser le processus de sélection du rapport, les nouvelles sélections écrasent les anciennes sélections B / C les 2 onglets partagés la même session. J'ai vérifié que c'était le cas en ouvrant plusieurs onglets et en progressant dans le processus de sélection.

Je suis en train de tenter de faire la distinction entre plusieurs exécutions de rapports afin que les sélections d'un rapport soient stockées à l'aide d'une clé de session unique à partir d'autres sélections de rapport. Cela se révèle aussi difficile, mais n'est pas vraiment lié au problème que je pensais avoir avec des données de session manquantes.

Si quelqu'un trouve ce post et pense qu'ils perdent des données de session de session au hasard et ne pouvez pas le répliquer, essayez de déboguer votre site et d'ouvrir plusieurs onglets. Prendre à travers les deux onglets en même temps illumina le problème pour moi.

htth


3 commentaires

Avoir un problème similaire, le problème est difficile à reproduire ... (les autres utilisateurs ne le font pas, et je ne pense pas qu'un navigateur peut causer cela, car le travail de navigateur doit uniquement envoyer le sessonisonid). Mais ci-dessus est une raison logique, nous explorerons si l'utilisateur ouvre plusieurs pages.


Évitez ce problème de plusieurs pages en utilisant un meilleur design. Supprimez tout l'état client de vos variables de session et mettez-les sur la querystring à la place ... IE. ? ReportName = Résumé & Page = 1 & Pagelength = 20 & ReportParameter1 = Et c Mon avis est que la session n'est utile que pour stocker l'ID utilisateur ou le hachage, lorsqu'ils se connectent ou reviennent avec un cookie.


@Awerealis, oui, les paramètres de passe de la QueryString sont en effet une option si vous n'avez que quelques paramètres. Malheureusement, il y a beaucoup de choses sur mes pages et j'utilise déjà l'état de l'historique de scriptManager qui charge l'URL avec les valeurs de hachage: En raison du grand nombre de paramètres de l'état de l'historique, je devais augmenter la longueur maximale HTTPRuntime B / C 260 n'a pas été suffisamment longue. Sans parler du fait qu'il y a beaucoup de choses en session que nous ne voulons pas / avons besoin d'exposer au client.



1
votes

J'ai rencontré ce problème car notre serveur a été configuré pour exécuter https. Les sessions ne seraient pas conservées si je rencontrais un simple http. Cependant, les sessions ont été conservées lors de l'exécution de HTTPS. Nous configurons donc une règle de réécriture d'URL pour toujours envoyer l'application à HTTPS s'ils sont venus via http.

En outre, des sessions ne fonctionneront pas localement ou sur le serveur sauf si vous exécutez HTTPS (notez la S à la fin de HTTPS), si vous avez la suivante dans votre fichier web.config: p>

<httpCookies httpOnlyCookies="true" requireSSL="true"/>


0 commentaires

0
votes

Une autre condition est là où les sessions peuvent perdre sa valeur.

Vous pouvez utiliser l'outil Fiddler pour tracer ce problème.

Le plus de condition peut être trouvé lorsque vous êtes un élément comme la source introuvable dans la solution. À ce moment-là, Server essayera de recharger cet objet non fondé ou perdu en redémarrant le projet. Le redémarrage du projet aura abouti à la réinitialisation de tous les objets de session.

merci.


0 commentaires

1
votes

Comme il m'a fallu un moment pour comprendre celui-ci, je pensais poster cela ici au cas où cela aide quelqu'un d'autre aussi.

J'ai couru dans une situation où c'est-à-dire que c.-à-don d'après et chrome laissait tomber des variables de session au hasard aussi . J'ai cherché et cherché et tout le monde a dit les choses habituelles ... Vérifiez le nom de domaine, consultez vos paramètres IIS pour les cookies ... etc.

Mon problème s'est avéré être une chose d'autorisations. < p> Dans mon web.config, j'ai une entrée de permission pour un dossier "public" accessible par le public non autorisé. xxx

Le problème était un appel public à un httphandler qui n'était pas du côté public. Dans une tentative de réutilisation du code, j'ai pointé le côté sécurisé et public au code du côté sécurisé. Je suppose qu'un effet secondaire, il a tué la session, sans un message d'erreur très significatif.

Je peux ajouter une autre entrée juste pour ce gestionnaire, ou je peux faire un public et une copie sécurisée de ce code ( une approche moins souhaitée).


0 commentaires