2012-01-13 13 views
14

so cosa utente è connesso con la seguente riga di codice:Ottenere un elenco di tutte le sessioni attive in ASP.NET

Session["loggedInUserId"] = userId; 

La domanda che ho è come faccio a sapere ciò che gli utenti sono connessi in modo che altri utenti possono vedere quali utenti sono attualmente connessi.

In altre parole, posso ottenere tutte le sessioni "loggedInUserId" che sono attive?

+0

possibile duplicato di [Lista tutti attivi ASP.NET Sessions] (http://stackoverflow.com/questions/1470334/list-all-active-asp-net-sessions) –

risposta

19

Non ho provato la soluzione di rangitatanz, ma ho usato un altro metodo e ha funzionato bene per me.

private List<String> getOnlineUsers() 
    { 
     List<String> activeSessions = new List<String>(); 
     object obj = typeof(HttpRuntime).GetProperty("CacheInternal", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null, null); 
     object[] obj2 = (object[])obj.GetType().GetField("_caches", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(obj); 
     for (int i = 0; i < obj2.Length; i++) 
     { 
      Hashtable c2 = (Hashtable)obj2[i].GetType().GetField("_entries", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(obj2[i]); 
      foreach (DictionaryEntry entry in c2) 
      { 
       object o1 = entry.Value.GetType().GetProperty("Value", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(entry.Value, null); 
       if (o1.GetType().ToString() == "System.Web.SessionState.InProcSessionState") 
       { 
        SessionStateItemCollection sess = (SessionStateItemCollection)o1.GetType().GetField("_sessionItems", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(o1); 
        if (sess != null) 
        { 
         if (sess["loggedInUserId"] != null) 
         { 
          activeSessions.Add(sess["loggedInUserId"].ToString()); 
         } 
        } 
       } 
      } 
     } 
     return activeSessions; 
    } 
+1

Molto bello! NB questo dovrebbe essere ottimizzato in modo che il riflesso sia memorizzato nella cache. Inoltre, naturalmente, entrambe le nostre soluzioni falliranno se il sito viene eseguito su più nodi Web. –

+4

Buon post. Sto ricevendo un errore nella riga 'object [] obj2 = (oggetto []) obj.GetType(). GetField (" _ caches ", BindingFlags.NonPublic | BindingFlags.Instance) .GetValue (obj);' in iis6 (server Windows 2003). Funzionando bene in Windows XP e Windows 7. – TechDo

+0

E se ho bisogno del SessionID per ogni sessione attiva? – Bergkamp

4

c'è una soluzione elencati in questa pagina List all active ASP.NET Sessions

private static List<string> _sessionInfo; 
private static readonly object padlock = new object(); 

public static List<string> Sessions 
{ 
     get 
     { 
      lock (padlock) 
      { 
       if (_sessionInfo == null) 
       { 
        _sessionInfo = new List<string>(); 
       } 
       return _sessionInfo; 
      } 
     } 
    } 

    protected void Session_Start(object sender, EventArgs e) 
    { 
     Sessions.Add(Session.SessionID); 
    } 
    protected void Session_End(object sender, EventArgs e) 
    { 
     Sessions.Remove(Session.SessionID); 
    } 

In sostanza è solo tiene traccia delle sessioni in un elenco che è possibile utilizzare per trovare informazioni su. Puoi davvero archiviare qualsiasi cosa in quello che vuoi veramente: nomi utente o qualsiasi altra cosa.

Non riesco a capire che c'è qualcosa nel livello ASP .net che lo fa già?

+6

Solo un piccolo promemoria: IIRC l'evento Session_End viene generato solo quando si utilizza lo stato della sessione InProcess. Quando si utilizza StateServer o SQL Server per lo stato sessione, non è questo il caso, il che significa che gli oggetti non verranno mai rimossi dalla raccolta _sessionInfo. Pertanto, è necessario implementare un meccanismo di "timeout" che rimuove le sessioni scadute. – M4N

+2

La mia comprensione è che 'List.Add/Remove' non è thread-safe. Quindi non è necessario 'lock (padlock)' su queste operazioni? –

+0

Sì, sembra corretto. Potrebbe anche usare una di queste nuove ConcurrentCollections, credo. –

Problemi correlati