Comment puis-je répertorier (et parcourir) toutes les sessions ASP.NET en cours?
Réponses
Trop de publicités?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);
}
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;
}
}
}
}
}
À 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. : /