【问题标题】:count number of sessions in ASP.net/c#计算 ASP.net/c# 中的会话数
【发布时间】:2011-07-07 10:10:51
【问题描述】:

我需要计算会话数,但是当我说会话数是否为 2 时,它不起作用。下面的例子是我的代码:

  // count curent session in order to keep two player
  if (HttpContext.Current.Session.Count == 2)
  {
     Response.Redirect("update.aspx");
  }

我把上面的代码放在代码后面。有没有其他方法可以说:如果会话数为 2,则执行其他操作...

【问题讨论】:

  • Count 属性用于获取会话状态集合中的项目数。
  • 会话对象也包含一些 asp.net 会话,而不仅仅是您放置的会话。你为什么不放一个换行符(快捷键:F9)并查看计数?
  • 有时在同一个浏览器中打开 2 个窗口(不会算作两个会话。有时即使从不同的浏览器也可能出现同样的问题。请从两个系统打开网页(我不确定;抱歉)

标签: .net asp.net session c#-4.0


【解决方案1】:

这是为该用户 (msdn reference) 存储在会话中的会话变量的计数...而不是当前存在的用户会话数。

您需要将会话计数存储在会话本身之外......也许在缓存或应用程序缓存中。

这里有一些 SO 问题可以帮助实现这一点:

【讨论】:

    【解决方案2】:

    注意:此示例仅适用于新手程序员(不适用于 ASP 专家程序员)

    1) 进入 Global.asax.cs 文件并识别应用程序启动函数,然后添加会话计数器变量。像这样……

        void Application_Start(object sender, EventArgs e)
        {
            // Code that runs on application startup                                       
            Application.Add("NOF_USER_SESSION", 0);
    

    2) 然后在同一个 GLobal.asax.cs 文件中,分别在 Session-Startup 和 Session-Endup 函数中分别添加/减少用户数...就像这样...

         void Session_Start(object sender, EventArgs e)
            {
                // Code that runs when a new session is started
                Application["NOF_USER_SESSION"] =          (int)Application["NOF_USER_SESSION"] + 1;
    ..
    ..
            void Session_End(object sender, EventArgs e)
            {
                // Code that runs when a session ends. 
                // Note: The Session_End event is raised only when the sessionstate mode
                // is set to InProc in the Web.config file. If session mode is set to StateServer 
                // or SQLServer, the event is not raised.
                Application["NOF_USER_SESSION"] = (int)Application["NOF_USER_SESSION"] - 1;
    ..
    ..
    

    3) 然后在程序中尽可能使用此应用程序级变量(int)Application["NOF_USER_SESSION"]

    【讨论】:

    【解决方案3】:

    我发现 Session_Start Session_End 有点不可靠,Session_End 有时似乎没有被调用。这就是我使用的,它维护一个客户端 IP 地址和上次访问日期的字典,在 20 分钟后超时“会话”。在这里,我将计数存储在从 Controller 派生的自定义基类中名为 NumberOfSessions 的静态属性中。

        public void Application_BeginRequest()
        {
            Application.Lock();
            string addr = Request.UserHostAddress;
            Dictionary<string, DateTime> sessions = Application["Sessions"] as Dictionary<string, DateTime>;
            sessions[addr] = DateTime.Now;
            List<string> remove = new List<string>();
            foreach(KeyValuePair<string, DateTime> kvp in sessions)
            {
                TimeSpan span = DateTime.Now - kvp.Value;
                if (span.TotalMinutes > 20)
                    remove.Add(kvp.Key);
            }
            foreach (string removeKey in remove)
                sessions.Remove(removeKey);
            BaseController.NumberOfUsers = sessions.Count;
            Application.UnLock();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      相关资源
      最近更新 更多