2009-03-26 5 views
5

Sur un site ASP.NET, quelles sont les techniques qui pourraient être utilisées pour suivre le nombre d'utilisateurs connectés au site à un moment donné?Détermination du nombre d'utilisateurs 'actifs' d'un site ASP.NET

Ainsi, par exemple, je pourrais produire un rapport montrant quelque chose comme ceci:

 10:00am 11:00am 12:00pm 1:00pm 2:00pm .... 
3/25  25  32  45  40  37 
3/26  31  38  50  57  40 
3/27  28  37  46  35  20 
etc. 

EDIT: Non, nous ne sommes pas l'utilisation du fournisseur d'appartenances ASP.NET, il utilise une session/hacky adulte à domicile méthode pour déterminer si un utilisateur est ou non en statut "connecté".

Répondre

8

Le site Web enregistre-t-il l'utilisateur? Si c'est le cas, vous pouvez mettre à jour un champ "Dernière visite" dans la table des utilisateurs chaque fois qu'ils demandent une nouvelle page, puis toutes les heures, faites une requête SQL qui saisit tous ceux qui ont une date de dernière visite. 15 minutes environ (supposé être actuellement sur le site).

Si vous n'avez pas de connexion, vous pouvez tout simplement le faire par adresse IP plutôt que par nom d'utilisateur. Avec cette méthode, cependant, vous pouvez rencontrer des problèmes de proxy (plusieurs utilisateurs du même réseau d'entreprise peuvent tous provenir d'une seule adresse IP, donc ils ne comptent que pour un seul utilisateur dans vos totaux), mais cela devrait être minime.

+0

Et, si le site est public, il y a les gros mandataires comme AOL et les militaires. – Amy

+0

L'ajout d'un champ 'Dernière visite' et sa mise à jour fréquente est probablement l'approche que nous allons adopter pour ce projet. Merci pour l'idée. –

3

Ce type de dépend de votre site. Si vous utilisez les fournisseurs d'abonnement ASP.Net, il existe une méthode: Membership.GetNumberOfUsersOnline() qui peut vous indiquer le nombre d'utilisateurs connectés. Je crois qu'il y a aussi des compteurs de performance. La notion d'utilisateur connecté est un utilisateur qui a fait quelque chose au cours des x dernières minutes où x est configurable.

Vous pouvez également utiliser des compteurs de performance pour suivre les demandes entrantes si vous voulez avoir une idée de la quantité d'activité qu'il y a.

Modifier

Juste pour que vous connaissez les fournisseurs d'appartenances ASP SQL implémente en enregistrant une date d'activité sur un champ dans la base de données. Il suffit de l'interroger pour toute activité dans x minutes.

J'ai ajouté une fonction d'interrogation côté client qui frappe notre serveur toutes les 2 minutes, donc pendant qu'un utilisateur est assis sur la page je sais qu'ils sont là même s'il n'y a aucune activité. Cela me permet également de forcer l'utilisateur à sortir du système, fournit une méthode de livrer d'autres messages du système. Genre de gentil.

+0

C'est une bonne information, donc je vais vous +1, mais pour mes besoins de la rwmnau idée de fourni est un meilleur ajustement pour mon scénario particulier. –

+0

Je vais aussi +1 - je n'avais pas considéré quelque chose qui sondait le côté client pour voir s'ils étaient toujours là. J'ai toujours trouvé que l'actualisation de page la plus récente est un indicateur assez fiable, mais si vous avez la bande passante à graver, cette méthode est encore plus précise. – SqlRyan

+0

Mon poller est en fait une méthode pour limiter les connexions simultanées ... la dernière personne dans les séjours dans le scénario. Nous avons un système de licence par utilisateur pour les entreprises ... un peu cool ... – JoshBerke

1

Je pense que ce que j'ai utilisé dans le passé était les fonctions Global.asax centrées autour de Session_Start et Session_End, augmentant un nombre avec le début, puis la fin est un peu difficile à cause du délai de session. Si vous n'êtes pas vraiment concerné par la précision du nombre, vous pouvez vous arrêter ici.

Si ce n'est pas le cas, vous utiliserez probablement une combinaison de l'événement javascript onUnload avec une sorte de requête ajax pour invalider la session et soustraire l'utilisateur. L'événement devrait voir si l'utilisateur était en train de quitter la page ou simplement aller à une autre page sur le site.

Quoi qu'il en soit, commencez par là. Je me souviens d'avoir à faire avec les sites ASP donc il y a certainement quelques informations sur cette méthode.

1

Il sont actifsmoniteur des statistiques de performance pour sessions dans les objets de performance ASP.NET, et vous pouvez suivre tous les cas, ou des applications individuelles.Vous pouvez accéder à ces statistiques via Admin ToolsPerformances ou par programmation via WMI.

Un script PowerShell très basique pour obtenir un total de ces compteurs:

(Get-WmiObject Win32_PerfRawData_ASPNET_ASPNETApplications SessionsActive).SessionsActive 

Un filtre doit être en mesure d'obtenir la stat pour un site spécifique.

+0

N'importe quel exemple de code utilisant 'programatically' via WMI pour ** performance monitor **? – Kiquenet

0

Premier jeu Temporisation de session pendant 1 minute.

Créer une page simple heartbeat.aspx sans contenu HTML uniquement le code javascript suivant:

<html> 
    <head> 
    <script language="javascript"> 
    function reloadPage() 
    { 
    window.navigate("heartbeat.aspx"); 
    } 
    </script> 
    </head> 
<body onload="window. setTimeout(‘reloadPage()’, 30000)"> 
</body> 
</html> 

Cela se redemander toutes les 30 secondes et garder la session en vie.

Placez la page heatbeat.aspx dans un cadre masqué.

Pour obtenir nombre d'utilisateurs seulement obtenir nombre de sessions en utilisant compteur statique dans les événements Session_Start et Session_End dans Global.asax.

+1

Pourquoi ne pas simplement avoir une requête côté client asynchrone (AJAX) frapper un service sur le dos ou un ashx ... pourquoi avoir encore une autre image. – JoshBerke

0

Si vous utilisez l'état de session InProc, vous pouvez le faire comme ça dans global.asax

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) 
    Application("ActiveSessionCount") = 0 
End Sub 

Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs) 
    Application("ActiveSessionCount") += 1 
End Sub 

Sub Session_End(ByVal sender As Object, ByVal e As EventArgs) 
    Application("ActiveSessionCount") -= 1 
End Sub 

Pour accéder à la valeur sur un formulaire web est tout aussi simple

Dim Count as Integer = Application("ActiveSessionCount") 
+0

j'ai essayé ceci et à chaque régénération le compteur incrémente –

2

Si vous utilisez SQL Server pour le stockage de session (ie <sessionState> mode est "SQLServer" dans web.config), vous ne pouvez pas utiliser une solution qui repose sur Session_End dans global.asax, car la méthode ne sera jamais appelée.

Cependant, en supposant que Agent SQL exécute le DeleteExpiredSessions travail correctement (ce qui devrait être par défaut lorsque l'Etat SQL a été installé), vous pouvez simplement exécuter l'instruction SQL suivante contre la Session Db:

SELECT COUNT(SessionId) FROM ASPStateTempSessions 
+0

Qu'est-ce que *** SessionId ***? est la valeur 'HttpContext.Current.Session.SessionID'? – Kiquenet

0
public class ActiveUsers 
{ 
    private static List<LastUserActivity> users; 
    private static object syncroot = new object(); 
    private static DateTime lastPruned; 

    public static int SessionLength = 20; 

    static ActiveUsers() 
    { 
     users = new List<LastUserActivity>(); 
     lastPruned = DateTime.UtcNow; 
    } 

    public void RecordUserActivity(int userId) 
    { 
     lock (syncroot) 
     { 
      var user = users.FirstOrDefault(x => x.UserId == userId); 
      if (user == null) 
      { 
       user = new LastUserActivity() { UserId = userId }; 
       users.Add(user); 
      } 
      user.UtcTime = DateTime.UtcNow; 

      if (lastPruned.AddMinutes(5) < DateTime.UtcNow) 
      { 
       Prune(); 
       lastPruned = DateTime.UtcNow; 
      } 
     } 
    } 

    private static void Prune() 
    { 
     users.RemoveAll(x => x.UtcTime.AddMinutes(SessionLength) < DateTime.UtcNow); 
    } 

    public int GetActiveUsers() 
    { 
     lock (syncroot) 
     { 
      return users.Count; 
     } 
    } 
} 
public class LastUserActivity 
{ 
    public int UserId { get; set; } 
    public DateTime UtcTime { get; set; } 
} 

Ajouter un appel à ActiveUsers dans une méthode global.asax (par exemple. BeginRequest, AcquireRequestState).

0

Sur Global.asax

protected void Application_Start(object sender, EventArgs e) 
     { 
      Application["SessionCount"] = 0; 
     } 

     protected void Session_Start(object sender, EventArgs e) 
     { 
      Application.Lock(); 
      Application["SessionCount"] = Convert.ToInt32(Application["SessionCount"]) + 1; 
      Application.UnLock(); 
     } 

     protected void Session_End(object sender, EventArgs e) 
     { 
      Application.Lock(); 
      Application["SessionCount"] = Convert.ToInt32(Application["SessionCount"]) - 1; 
      Application.UnLock(); 
     } 

application Get [ "SessionCount"] sur la page que vous voulez

Questions connexes