2012-01-13 18 views
14

tüm etkin oturumların bir listesini alın:ben aşağıdaki kod satırı ile kaydedilir hangi kullanıcı biliyor ASP.NET

Session["loggedInUserId"] = userId; 

var soru Kullanıcıların böylece kaydedilir neyi nasıl anlarım edilir Bu kullanıcı diğer kullanıcıların ne yaptığını görebiliyorlar.

Diğer bir deyişle, aktif olan tüm "loginInUserId" oturumlarını alabilir miyim?

+0

[List tüm aktif ASP.NET Sessions] (http://stackoverflow.com/questions/1470334/list-all-active-asp-net-sessions) –

cevap

19

Ben rangitatanz çözümü denemedim, ama başka bir yöntem kullandım ve benim için iyi çalıştı.

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

Çok havalı! NB, bu, yansıma önbelleğe alınacak şekilde optimize edilmelidir. Ayrıca, site birden fazla web düğümünün üzerinden çalıştırılıyorsa, elbette çözümlerimizin ikisi de başarısız olur. –

+4

İyi gönderi. Nesnede bir hata alıyorum object [] obj2 = (object []) obj.GetType(). GetField ("_ caches", BindingFlags.NonPublic | BindingFlags.Instance) .GetValue (obj); 'iis6'da (Windows sunucusu 2003). Windows XP ve Windows 7'de çalışıyoruz. – TechDo

+0

Ve her aktif oturum için SessionID'ye ihtiyacım varsa? – Bergkamp

4

bu sayfayı Temelde 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); 
    } 

sadece hakkında bilgi edinmek için kullanabileceğiniz bir Listesine oturumları izleyen listelenen bir çözüm yoktur. Gerçekten istediğiniz herhangi bir şeyi gerçekten saklayabilir - Usernames veya neyse.

ASP.NET katmanında bunu zaten yapan bir şey yok htink yok mu?

+6

Sadece küçük bir hatırlatma olası yinelenen: IIRC Session_End olayı, yalnızca ınprocess oturum durumu kullanıldığında ortaya çıkar. Oturum durumu için StateServer veya SQL server kullanırken, bu, nesnelerin _sessionInfo koleksiyonunuzdan asla kaldırılmayacağı anlamına gelmez. Bu nedenle, zaman aşımı oturumlarını kaldıran bazı "zaman aşımı" mekanizması uygulamak zorunda kalacaksınız. – M4N

+2

Anlayışım, 'List.Add/Remove', iş parçacığı için güvenli değildir. Yani bu operasyonlarda 'kilitlemek (asma kilit)' yapmanıza gerek yok mu? –

+0

Evet, kulağa doğru geliyor. Ayrıca sanırım bu yeni ConcurrentCollections birini kullanabilir. –

İlgili konular