none
Obter (Listar) TODAS as Sessões Ativas RRS feed

  • Discussão Geral

  • Procurei um pouco na internet pois não achei na documentação do MSDN e nenhum exemplo que me entregasse o que preciso.
    Em um tópico do StackOverflow, achei a solução (o código abaixo me traz exatamente o que procuro), mas é do meu entendimento que esse tipo de abordagem não é a ideal (usar "Reflection" para acessar variáveis/métodos internos me parece um recurso que só deve ser usado em último caso - se é que seria usado) e procuro por algo mais "dentro do padrão" do que o C#/ASP.net oferece.

    public static global::System.Collections.Generic.IEnumerable<global::System.Web.SessionState.SessionStateItemCollection> GetSessions()
    {
        object obj = typeof(global::System.Web.HttpRuntime).GetProperty("CacheInternal", global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Static).GetValue(null, null);
        object[] obj2 = (object[])obj.GetType().GetField("_caches", global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance).GetValue(obj);
        for (int i = 0; i < obj2.Length; i++)
        {
            global::System.Collections.Hashtable c2 = (global::System.Collections.Hashtable)obj2[i].GetType().GetField("_entries", global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance).GetValue(obj2[i]);
            foreach (global::System.Collections.DictionaryEntry entry in c2)
            {
                object o1 = entry.Value.GetType().GetProperty("Value", global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance).GetValue(entry.Value, null);
                if (o1.GetType().ToString() == "System.Web.SessionState.InProcSessionState")
                {
                    global::System.Web.SessionState.SessionStateItemCollection sess = (global::System.Web.SessionState.SessionStateItemCollection)o1.GetType().GetField("_sessionItems", global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance).GetValue(o1);
                    if (sess != null) { yield return sess; }
                }
            }
        }
    }

    O objectivo é obter TODAS as sessões ativas do site, e seus objetos salvos em sessão.

    quinta-feira, 24 de agosto de 2017 18:25