Quelle est la manière la plus simple et la plus discrète de maintenir une session ASP.NET active tant que la fenêtre du navigateur est ouverte? S'agit-il d'appels AJAX chronométrés? Je veux éviter ce qui suit: parfois les utilisateurs gardent leur fenêtre ouverte pendant une longue période, puis entrent des éléments, et lors de l'envoi, rien ne fonctionne plus car la session côté serveur a expiré. Je ne souhaite pas augmenter la valeur du délai d'attente pendant plus de 10 minutes sur le serveur car je souhaite que les sessions fermées (en fermant la fenêtre du navigateur) expirent rapidement.
Suggestions, exemples de code?
Réponses:
J'utilise JQuery pour effectuer un simple appel AJAX à un gestionnaire HTTP factice qui ne fait rien d'autre que maintenir ma session en vie:
Le gestionnaire de session peut être aussi simple que:
La clé est d'ajouter IRequiresSessionState, sinon Session ne sera pas disponible (= null). Le gestionnaire peut bien sûr également renvoyer un objet sérialisé JSON si certaines données doivent être renvoyées au JavaScript appelant.
Mis à disposition via web.config:
ajouté de balexandre le 14 août 2012
J'ai tellement aimé cet exemple que je veux m'améliorer avec le HTML / CSS et la partie beat
change ça
dans
et ajouter
HTML et CSS
voici un exemple en direct pour seulement la partie battante: http://jsbin.com/ibagob/1/
la source
DateTime.Now
était simplement de faire apparaître la dernière mise à jour de la session via le battement de cœur.Si vous utilisez ASP.NET MVC, vous n'avez pas besoin d'un gestionnaire HTTP supplémentaire ni de certaines modifications du fichier web.config. Tout ce dont vous avez besoin - juste pour ajouter une action simple dans un contrôleur Home / Common:
, écrivez un morceau de code JavaScript comme celui-ci (je l'ai mis dans l'un des fichiers JavaScript du site):
, et initialisez cette fonctionnalité en appelant une fonction JavaScript:
Notez s'il vous plaît! J'ai implémenté cette fonctionnalité uniquement pour les utilisateurs autorisés (il n'y a aucune raison de garder l'état de session pour les invités dans la plupart des cas) et la décision de garder l'état de session actif n'est pas seulement basée sur - le navigateur est ouvert ou non, mais l'utilisateur autorisé doit faire une certaine activité sur le site (déplacez une souris ou tapez une touche).
la source
@Url.Action("KeepSessionAlive","Home")
la fonction d'initialisation pour ne pas avoir à coder en dur l'URL et également lancer le premier bloc à l'intérieur d'un IIFE et simplement exporter leSetupSessionUpdater
car c'est la seule chose qui doit être invoquée en externe - quelque chose comme ceci: SessionUpdater.jssetInterval(KeepSessionAlive, 300000)
Chaque fois que vous faites une demande au serveur, le délai d'expiration de la session est réinitialisé. Vous pouvez donc simplement faire un appel ajax à un gestionnaire HTTP vide sur le serveur, mais assurez-vous que le cache du gestionnaire est désactivé, sinon le navigateur mettra en cache votre gestionnaire et ne fera pas de nouvelle requête.
KeepSessionAlive.ashx.cs
.JS:
@veggerby - Il n'y a pas besoin de la surcharge de stockage des variables dans la session. Il suffit de préformer une requête auprès du serveur.
la source
Avez-vous vraiment besoin de conserver la session (avez-vous des données dedans?) Ou suffit-il de simuler cela en réinstituant la session lorsqu'une demande arrive? Si c'est le premier, utilisez la méthode ci-dessus. Si c'est le cas, essayez quelque chose comme l'utilisation du gestionnaire d'événements Session_End.
Si vous avez une authentification par formulaire, vous obtenez quelque chose dans le Global.asax.cs comme
Et vous définissez la durée de vie du ticket beaucoup plus longue que la durée de vie de la session. Si vous ne vous authentifiez pas ou si vous utilisez une méthode d'authentification différente, il existe des astuces similaires. L'interface Web de Microsoft TFS et SharePoint semblent les utiliser - le problème est que si vous cliquez sur un lien sur une page obsolète, vous obtenez des invites d'authentification dans la fenêtre contextuelle, mais si vous utilisez simplement une commande, cela fonctionne.
la source
vous pouvez simplement écrire ce code dans votre fichier de script java c'est tout.
Le
(20-1)*60*1000
temps d'actualisation est, il actualisera le délai d'expiration de la session. Le délai de rafraîchissement est calculé comme le délai par défaut de iis = 20 minutes, ce qui signifie que 20 × 60000 = 1200000 millisecondes - 60000 millisecondes (une minute avant l'expiration de la session) est 1140000.la source
Voici une solution alternative qui devrait survivre si le PC client passe en mode veille.
Si vous avez un grand nombre d'utilisateurs connectés, utilisez-le avec prudence car cela pourrait consommer beaucoup de mémoire serveur.
Après vous être connecté (je le fais dans l'événement LoggedIn du contrôle de connexion)
la source
J'ai passé quelques jours à essayer de comprendre comment prolonger une session utilisateur dans WebForms via une boîte de dialogue contextuelle donnant à l'utilisateur la possibilité de renouveler la session ou de lui permettre d'expirer. La chose n ° 1 que vous devez savoir est que vous n'avez besoin d'aucun de ces trucs sophistiqués de 'HttpContext' dans certaines des autres réponses. Tout ce dont vous avez besoin est le $ .post () de jQuery; méthode. Par exemple, lors du débogage, j'ai utilisé:
et sur votre site en direct, vous utiliseriez quelque chose comme:
C'est aussi simple que ça. De plus, si vous souhaitez inviter l'utilisateur à renouveler sa session, procédez comme suit:
N'oubliez pas d'ajouter la boîte de dialogue à votre html:
la source
En ce qui concerne la solution de veggerby, si vous essayez de l'implémenter sur une application VB, faites attention en essayant d'exécuter le code fourni via un traducteur. Ce qui suit fonctionnera:
Aussi, au lieu d'appeler comme heartbeat () fonction comme:
Au lieu de cela, appelez-le comme:
Numéro un, setTimeout ne se déclenche qu'une seule fois alors que setInterval se déclenche à plusieurs reprises. Numéro deux, appeler heartbeat () comme une chaîne ne fonctionnait pas pour moi, alors que l'appeler comme une fonction réelle le faisait.
Et je peux absolument confirmer à 100% que cette solution surmontera la décision ridicule de GoDaddy de forcer une session Apppool de 5 minutes à Plesk!
la source
Voici la version du plugin JQuery de la solution Maryan avec optimisation des poignées. Uniquement avec JQuery 1.7+!
et comment il importe dans votre * .cshtml
la source
[En retard à la fête ...]
Une autre façon de faire cela sans la surcharge d'un appel Ajax ou d'un gestionnaire WebService consiste à charger une page ASPX spéciale après un laps de temps donné (c'est-à-dire avant l'expiration de l'état de session, qui est généralement de 20 minutes):
La
KeepAlive.aspx
page est simplement une page vide qui ne fait que toucher / rafraîchir l'Session
état:Cela fonctionne en créant un
img
élément (image) et en forçant le navigateur à charger son contenu à partir de laKeepAlive.aspx
page. Le chargement de cette page amène le serveur à toucher (mettre à jour) l'Session
objet, prolongeant la fenêtre de temps glissant d'expiration de la session (généralement de 20 minutes supplémentaires). Le contenu réel de la page Web est supprimé par le navigateur.Une autre façon, et peut-être plus propre, de le faire est de créer un nouvel
iframe
élément et d'y charger laKeepAlive.aspx
page. L'iframe
élément est masqué, par exemple en en faisant un élément enfant d'undiv
élément masqué quelque part sur la page.L'activité sur la page elle-même peut être détectée en interceptant les actions de la souris et du clavier pour tout le corps de la page:
Je ne peux pas m'attribuer le mérite de cette idée; voir: https://www.codeproject.com/Articles/227382/Alert-Session-Time-out-in-ASP-Net .
la source