2009-04-13 4 views
1

Nous suivons une procédure dans notre travail lors du développement d'une page web, est de lier la page à une ou plusieurs variables de session, ces variables de session sont utilisées uniquement pour cette page, pour contenir les objets de traitement actuels leur. Comment est-ce que je pourrais jeter ces variables de session en fermant la page?Comment rejeter une variable de session lors de la fermeture de la page Web?

Des suggestions concernant cette technique ou comment résoudre ce problème?

Répondre

4

Il n'y a aucun événement côté serveur qui est soulevée lorsqu'une page est laissée/fermée. De même, l'événement Session_End (mentionné dans les autres réponses) n'est pas appelé lorsqu'une page est laissée, puisque l'utilisateur peut naviguer vers d'autres pages de la même application web (et donc la session continuera à exister).

Je peux penser à 3 voies possibles pour résoudre (ou contourner) cette question:

- utiliser ViewState pour stocker des données avec la page-portée. C'est ce que ViewState est fait, et à moins d'avoir beaucoup de données, cela ne devrait pas poser de problème. Si vous avez beaucoup de données, n'oubliez pas qu'elles seront sérialisées/désérialisées et envoyées au client/retournées au serveur pour chaque requête (ce qui peut entraîner des demandes importantes et donc de mauvaises performances).

- au lieu de mettre les données dans la session, le mettre dans le cache (avec un délai d'expiration à faible glissement). Sur votre page, vous pouvez accéder à vos données de la même manière qu'à partir de la session, par exemple data = Cache ["data"], mais vous devez vous préparer à ce que les données soient retirées du cache (vous devez le recharger encore à partir de DB par exemple), si le temps entre deux demandes était plus grand que le temps d'expiration.

- utiliser le client-side (javascript) onUnload événement, et déclencher une action (par exemple un rappel Ajax) pour supprimer les données de la session. Mais je pense que l'événement onUnload n'est pas fiable (il ne sera pas déclenché dans tous les cas, par exemple lorsque le navigateur est arrêté par un crash ou avec le gestionnaire de tâches, ou si javascript est désactivé).

+0

Pour ViewState: parfois il y a beaucoup de données car parfois l'objet de traitement contient ses données et ses données de détails pour Cache, je ne sais pas sur ses performances par rapport à viewstate ou session. Pour un événement de déchargement, quels sont vos doutes. – Ahmed

+0

onUnload est incohérent, il n'est pas sûr qu'il se déclenche si le navigateur tombe en panne ou s'il y a quelque chose comme un arrêt du navigateur. Cela dit, c'était la solution que nous avons utilisée dans un projet récent, j'ai été impliqué dans –

+0

ci-dessus je voulais dire "force d'arrêt" où vous lisez "arrêt du navigateur" –

0

Si vous utilisez uniquement des variables pour cette page, stockez-les dans viewstate. ViewState convient aux variables de portée de page.

-1

Si vous utilisez des sessions ASP.NET (ce que vous êtes probablement), vous pouvez ajouter un fichier global.asax à votre solveur. Là ce délégué de l'événement doit être trouvé (sinon, créez):

protected void Session_End(object sender, EventArgs e) 
{ 

} 

.. Ici vous pouvez effacer votre collection de session.

protected void Session_End(object sender, EventArgs e) 
    { 
     Session.Clear(); 
    } 

Ce sera tiré lorsque la session expire ou lorsqu'un utilisateur clique déconnectent :)

+0

Ce sera déclenché lorsque la session expire ou lorsqu'un utilisateur clique sur la déconnexion, j'ai besoin que ces variables de session soient discutées lors de la fermeture/fermeture de la page? – Ahmed

+0

Mon mauvais pour malentendu alors :) Vous devriez regarder la réponse de Martin - cependant, vous ne pouvez pas compter sur le client pour dire au serveur quand il ferme une page (ou navigue à un autre). C'est la base du problème :( – cwap

Questions connexes