50 votes

Répertorie toutes les sessions ASP.NET actives

Comment puis-je répertorier (et parcourir) toutes les sessions ASP.NET en cours?

36voto

Jan Remunda Points 3088

Itérer à travers toutes les sessions ne sera probablement pas très thread-safe. Mais vous pouvez collecter des informations sur les sessions dans global.asax evets Session_Start et Session_End:

 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);
        }
 

20voto

20voto

ajitdh Points 312

Il ne semble pas raison de dire qu'il n'est pas une classe ou une méthode qui fournit cette information. Je pense que c'est un livre agréable à fonctionnalité pour SessionStateStoreProvider de disposer d'une méthode qui retourne le courant de la session active, de sorte que nous n'avons pas à suivre activement la session de vie dans la fonction session_start et session_end comme mentionner par Jan Remunda.

Puisque je ne pouvais pas trouver tout de boîte de méthode pour obtenir tous liste de session, Et je n'ai pas voulu suivre la session de vie, comme mentionné par Jan, je me retrouve avec cette solution, qui a fonctionné dans mon cas.

public static IEnumerable<SessionStateItemCollection> GetActiveSessions()
{
    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)
                {
                    yield return sess;
                }
            }
        }
    }
}

0voto

powderllama Points 11

Au démarrage de la session, ajoutez la session obj à une liste de la classe globale. (Global.asax ou Global.cs / vb)

-1voto

Nathan Taylor Points 13582

À ma connaissance, avec les sessions standard en mémoire, vous ne pouvez pas. C’est quelque chose avec lequel je me débattais la semaine dernière et j’en suis venu à la conclusion que ce n’est possible que si vous utilisez un serveur d’état de session. Cela me semble plutôt étrange du point de vue de la conception, si vous me le demandez. : /

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X