2010-08-13 12 views
5

Come faccio a tenere traccia del numero di sessioni correnti sul mio sito web?Tieni traccia di chi è sul sito web in questo momento

+5

Parte di questo dipende dalla definizione di attivo. Potremmo parlare di sessioni numero-corrente, o di accesso durante l'ultimo mese o effettivi contributori-entro l'ultimo-X-giorni. Si prega di fornire un po 'più di informazioni su cosa, esattamente, si vuole misurare. – kbrimington

risposta

2

Se vuoi solo sapere chi guarda le pagine di un piccolo sito rinky-dink, un modo è quello di avere una lista (o statica) delle ultime richieste, insieme alla data/ora della richiesta . Ogni volta che qualcuno richiede una pagina, rimuovere tutti i "vecchi" hit (più vecchi di X minuti) e aggiungere (o aggiornare) le informazioni del visitatore con una data/ora,

Nota, per un sito molto occupato, questa sarebbe probabilmente una cattiva idea. Una soluzione un po 'più scalabile sarebbe quella di avere una colonna "ultima visita" nella tabella degli utenti e aggiornarla ogni volta che l'utente richiede una pagina. Ma ciò non sarebbe utile per tenere traccia degli utenti anonimi/non registrati.

In entrambi i casi, per vedere chi è "attivo", si passa attraverso i dati e si trovano tutte le visite/utenti con un tempo di ultima visita meno di X minuti fa, dove X è un numero che si ritiene appropriato. 20-60 minuti di solito sono abbastanza buoni.

0

Un metodo molto semplice è quello di tenere traccia dell'ultima attività da parte di ciascun utente. Dopo un periodo di non attività, dici che quell'utente non è più attivo.

0

Un modo semplice sarebbe scrivere un piccolo modulo http (o addirittura sfruttare il global.asax) che gestisce quando viene creata la sessione e quando la sessione termina per aggiornare una raccolta o una tabella di database di tutti gli utenti attualmente attivi e quando la sessione termina per rimuovere il record.

RE: Al termine della sessione si dovrebbe comunque avere accesso alla sessione stessa o per lo meno l'identificatore di sessione sia dalla proprietà mittente o la proprietà EventArgs. Questo ti darà un modo semplice per associare una sessione di asp.net a un utente usando l'identificatore di sessione. Puoi testarlo facilmente avviando l'applicazione in debug e nella finestra immediata fai Session.Abandon(); per attivare questo evento a livello di codice per vederlo accadere con codice live che puoi eseguire il debug.

Nota Non sono sicuro al 100% sull'uso del mittente/args ma dovresti essere in grado di accedere alla sessione stessa direttamente all'interno della sessione globale.asaxEnd da solo facendo questa.Sessione che dovrebbe essere ancora disponibile (assicurati di non utilizzare HttpContext.Current.Session perché il contesto non esiste quindi).

+0

Ho provato questo, e non funziona così bene. Quando la sessione termina con un timeout, ottieni l'evento terminato alla fine della sessione, quindi non hai idea di quale sessione sia terminata. –

0

Una cosa che si potrebbe fare è implementare il proprio SessionStateStoreProvider: http://msdn.microsoft.com/en-us/library/ms178587.aspx

Nell'implementazione di GetItem, si dovrebbe aggiornare la propria collezione di dati di sessione in corso e nell'implementazione RemoveItem, si ha accesso alla ASP Dati di sessione .NET, quindi è possibile rimuovere l'elemento dalla raccolta prima della rimozione della sessione ASP.NET nel solito modo. Puoi interrogare la tua collezione per le sessioni attualmente attive.

RemoveItem

alternativa:

Se si utilizza il ASP.NET provider di appartenenze, è possibile interrogare il database con qualcosa sulla falsariga di:

Create Procedure dbo.GetCurrentUsers 
@ActiveSince DateTime 
AS 
    SELECT U.UserId, U.UserName, M.Email 
    FROM aspnet_Users U 
    INNER JOIN aspnet_membership M ON M.UserId = U.UserId 
    WHERE U.LastActivityDate > @ActiveSince 
GO 

Si potrebbe impostare @ActiveSince per essere l'attuale DateTime meno il timeout della sessione sul tuo sito.

var sessionState = (System.Web.Configuration.SessionStateSection) 
       ConfigurationManager.GetSection("system.web/sessionState"); 
DateTime activeSince = DateTime.Now.AddMinutes(0 - sessionState.Timeout.TotalMinutes); 

Ciò comprende gli utenti che sono andati al tuo sito e poi a sinistra subito, ma non c'è modo di dire se sono ancora lì, a meno che non si dispone di uno script nella pagina che invia regolarmente una chiamata AJAX al server che dice che è ancora aperto. Raccomanderei contro questo dato che aumenterebbe il traffico e sprecherà risorse senza alcun reale guadagno.

0

Mi occuperei principalmente di Global.asax. Avere Session_Start aggiungere a una lista globale dell'applicazione contenente i dati che si desidera tracciare (ad es. Utente, SessionId, StartTime, LastRequestTime).

Quando un utente raggiunge per la prima volta il sito, Session_Start aggiungerà una voce a GlobalList. Questo sarà sicuro che ogni utente unico ottiene la propria voce (gestire anche noioso). Se lo desideri, una volta che un utente effettua l'accesso, puoi aggiornare GlobalList per impostare le informazioni sull'utente (nome, ID, qualsiasi altra cosa).

Successivamente, Application_Start avvia un thread in background che passa attraverso l'elenco globale e rimuove gli elementi scaduti (in base alla soglia impostata, TimeSpan di LastRequestTime-StartTime).

Se si desidera distribuire questo in uno scenario WebFarm, è necessario spostare l'elenco nel database.

Problemi correlati