2009-07-14 6 views
4

Je dois indiquer combien de personnes sont en ligne sur ce site. Le site a été développé en utilisant ASP.NET 2.0. Actuellement, j'utilise le début de session (augmenter de 1) et l'événement de fin de session (diminuer de 1) dans Global.asax. Mais l'événement Session_End n'appelle pas correctement la plupart du temps. Y a-t-il un meilleur moyen d'y parvenir?Comment trouver combien de personnes sont en ligne sur un site Web

+0

Utilisez-vous l'un des fournisseurs d'appartenance ASP.NET? Comme le SqlMembershipProvider? –

Répondre

3

Nous avons le même problème dans un projet, après plusieurs méthodes, nous finissons par suivre le temps d'inactivité de chaque utilisateur, lorsque le temps d'inactivité est dépassé, nous considérons que l'utilisateur n'est plus en ligne. bien sûr, vous devez également tenir compte de l'autre problème tel que la déconnexion de l'utilisateur, ou se reconnecter après le délai d'attente ...

5

Vous n'irez pas beaucoup mieux puis incrémenter en Session_Start et en décrémentant en Session_End sauf si vous utilisez d'autres moyens comme une base de données. Lorsque vous authentifiez vos demandes, vous pouvez mettre à jour un horodatage dans la base de données pour montrer que l'utilisateur a été actif et après un temps donné (disons 15 minutes), la requête qui recueille le nombre d'utilisateurs simultanés ignore cette ligne dans la base de données (décrémentant ainsi le compte).

4

Une recherche rapide sur Google a révélé un handy way of doing this avec un HttpModule. Dans l'ensemble, Yohann a fait un excellent travail avec cela. Il met en œuvre un délai d'attente défini ci-dessus, mais sinon, il n'existe aucun moyen précis de le faire en dehors de vérifier le fichier perfmon.exe du serveur et de vérifier le nombre de connexions en cours du WebService >> WebAppPool. Lorsque j'ai implémenté cela moi-même, j'ai utilisé une table SQL Server pour stocker une date/heure et des informations sur l'authentification. J'ai décrémenté le compte en réévaluant et en faisant correspondre les adresses IP chaque fois que je devais actualiser le cache de données (une fois toutes les 10 minutes).

+0

+1 Cela ressemble à une approche très saine. L'utilisation de SQL Server pour sauvegarder le stockage est requise pour les implémentations de batterie de serveurs Web (sauf si vous utilisez quelque chose comme Velocity pour un magasin de session). Bookmarked pour l'expérimentation future. Merci! –

3

Je l'ai déjà fait et je peux attester que Session_End ne sera appelée que si vous détruisez manuellement la session (Session.Abandon). Quand vous y réfléchissez, cela a du sens. Si l'utilisateur n'est pas sur le site, le code ne sera jamais exécuté. Ce que j'ai fait était stocker une hashtable dans l'état d'application qui a contenu le nom d'utilisateur et un Datetime pour la dernière fois que l'utilisateur a été vu sur le site. Pour chaque chargement de page, j'appellerais une fonction qui insérerait ou mettrait à jour cette valeur pour l'utilisateur courant. Ensuite, il serait éliminer la liste entière et supprimer toutes les entrées qui sont plus anciennes que le délai d'expiration de la session (20 minutes ou autre). N'oubliez pas d'utiliser le verrouillage ou la synchronisation pour éviter les conditions de course lorsque vous modifiez cette liste.

Cela a l'avantage non seulement de connaître le nombre de personnes, mais également les utilisateurs.

Si vous n'avez pas quelque chose d'unique comme un nom d'utilisateur, vous pouvez utiliser Session.SessionID à la place. Il devrait être unique par visiteur de votre site. Mais attention, l'utilisation d'une variable d'état d'application ou d'application a son propre lot de problèmes car elle ne se partage pas entre les processus en mode "Web Garden" ou dans une configuration multiserveur. Vous auriez besoin d'un support plus persistant comme une base de données ou un cache distribué pour les configurations à plus grande échelle.

Questions connexes