计算ASP.net/c#中的会话数

时间:2011-07-07 10:10:52

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

我需要计算会话次数,但是当我说会话数量是2然后做某事时它不起作用。以下示例是我的代码:

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

我将上面的代码放在代码后面。还有其他任何方式我可以说:如果会话数量是2其他做某事......

4 个答案:

答案 0 :(得分:2)

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

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

以下是一些有助于实现此问题的SO问题:

答案 1 :(得分:0)

您可以使用WMI查询应用程序中的活动会话数。

答案 2 :(得分:0)

注意:此示例仅适用于新手程序员(不适用于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 :(得分:0)

我发现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();
    }