【问题标题】:Get current sessions for Castle-Monorail site?获取 Castle-Monorail 站点的当前会话?
【发布时间】:2011-01-28 09:01:17
【问题描述】:

我正在修改我继承的 Castle-Monorail 网站,发现查看当前在线用户列表会很有用。目前有过滤器可以确定谁可以访问站点的哪些部分,这样我就可以区分登录会话和未登录会话。有没有一种简单的方法可以获取活动会话列表,以便我可以确定谁登录了?

【问题讨论】:

  • 您想要所有个会话的列表,还是只需要一个已登录会话的列表?
  • 所有当前登录的会话。
  • Monorail 是 ASP.NET 的包装器,因此如果您将这个问题带到一个通用的 ASP.NET 论坛(或在 SO 上标记为 ASP.NET),您可能会得到更多的人以完美的答案回答。
  • 顺便说一句,我的答案应该是这样的:如果您使用进程内会话存储,请连接到 Session_Start 和 Session_End,并使用它们来控制当前登录用户的列表。
  • 感谢 cmets。我已经添加了标签,看看是否有人回答。如果不是,我想我会把它放在待办事项列表的后面。

标签: c# asp.net castle-monorail


【解决方案1】:

我相信没有简单的方法,除非您将用户登录信息存储在数据库或应用程序变量中,否则您无法知道有多少活动会话。

【讨论】:

    【解决方案2】:

    这是我最终得到的解决方案:

    (在https://stackoverflow.com/q/1470571/126785 和 Ken Egozi 的 cmets 的帮助下)

    在 Global.asax.cs 中:

    private static readonly object padlock = new object();
    private static Dictionary<string,SessionData> sessions = new Dictionary<string,SessionData>();
    public static Dictionary<string, SessionData> Sessions
    {
        get { lock (padlock) { return sessions; } }
    }
    
    public struct SessionData
    {
        public string Name { get; set; }
        public int AccountId { get; set; }
        public string CurrentLocation { get; set; }
    }
    
    protected void Session_Start(object sender, EventArgs e)
    {
        Sessions.Add(Session.SessionID, new SessionData());
    }
    
    protected void Session_End(object sender, EventArgs e)
    {
        Sessions.Remove(Session.SessionID);
    }
    
    public static void SetSessionData(string sessionId, int accountId, string name, string currentLoc)
    {
        Sessions.Remove(sessionId);
        Sessions.Add(sessionId, new SessionData { AccountId = accountId, CurrentLocation = currentLoc, Name = name });
    }
    
    public static void SetCurrentLocation(string sessionId, string currentLoc)
    {
        SessionData currentData = Sessions[sessionId];
        Sessions.Remove(sessionId);
        Sessions.Add(sessionId, new SessionData { AccountId = currentData.AccountId, CurrentLocation = currentLoc, Name = currentData.Name });
    }
    

    然后登录时:

    Global.SetSessionData(((HttpSessionStateContainer)Session.SyncRoot).SessionID,account.Id,account.Name,"Logged In");
    

    现在我只需要找出更新位置的最佳位置。每个函数的调用可能有点烦人!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多