如何计算特定的会话变量?

时间:2015-03-18 19:05:50

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

我想知道我是否可以计算特定的会话变量。 我想计算当前有多少用户登录该站点以及现在有多少用户访问该站点。 这是我做的(代码)

public void Session_OnStart()
{
    Application.Lock();
    Application["UsersOnline"] = (int)Application["UsersOnline"] + 1;
    Application.UnLock();
}

public void Session_OnEnd()
{
    Application.Lock();
    Application["UsersOnline"] = (int)Application["UsersOnline"] - 1;
    Application.UnLock();
}

此代码工作正常,但现在我不知道如何计算登录的用户。我想做类似的事情:

public void Session_OnStart()
{
if (Session["IsLoggedIn"] == "true") 
{
Application.Lock();
Application["UsersLoggedIn"] = (int)Application["UsersLoggedIn"] + 1;
Application.UnLock();
    }
}

然后如果会话关闭,它将从应用程序[" UsersLoggedIn"]中减去1。我的问题是,我无法计算'IsLoggedIn'会话开始的会话,因为它是null,因此它不会工作。所以现在我们开始讨论,无论如何都要触发该应用程序变量的计数?喜欢在该会话为真时创建一个事件,然后告诉应用程序在该事件上向计数器添加+1?我很抱歉,如果我的问题不清楚,请问我更多的细节,如果它不清楚,你只是不知道我想要你。 谢谢您的帮助!

6 个答案:

答案 0 :(得分:1)

肮脏,hacky,低效,解决方案(假设使用表单身份验证):

public void Global_BeginRequest(object sender, EventArgs e)
{
    if(
        Context.User != null && 
        !String.IsNullOrWhiteSpace(Context.User.Identity.Name) && 
        Context.Session != null && 
        Context.Session["IAMTRACKED"] == null
    )
    {
        Context.Session["IAMTRACKED"] = new object();
        Application.Lock();
        Application["UsersLoggedIn"] = Application["UsersLoggedIn"] + 1;
        Application.UnLock();
    }
}

在较高级别,这可以在每次请求时检查用户是否已登录,如果是,则将用户标记为已登录并递增登录。这假设用户无法注销(如果可以,您可以为已注销和跟踪的用户添加类似的测试)。

这是一种解决问题的可怕方法,但它是一种有效的原型,可以证明你的问题是可以解决的。

请注意,这会在应用程序回收后大大低估登录;登录比会话长得多。

答案 1 :(得分:0)

我认为会话项目是客户端的。 您可以创建一个查询来计算打开的连接(因此您正在使用MySQL数据库。) 另一种选择是使用外部软件(我使用tawk.to helpchat,它显示实时访问页面的用户数量)。 您可以使用它,使supportchat不可见,并且只将其放在可供登录用户访问的分页上。

OR

执行更新查询,从数据库中的列添加/减去(使用onStart和OnEnd挂钩)。

答案 2 :(得分:0)

这是使用 Session [] 变量无法做到的问题。您需要使用数据库(或中央数据源来存储活动用户的总数)。例如,您可以在应用程序中看到,当应用程序启动时没有Application["UsersOnline"]变量时,您可以在实例中创建它。这就是为什么每次启动应用程序时,都会使用新值初始化变量;总是 1

您可以为应用程序创建单独的表,然后在其中创建一个包含 OnlineUsers 值的列。每次触发应用启动事件时,都可以增加。

public void Session_OnStart()
{
    Application.Lock();
    Application["UsersOnline"] = (int)Application["UsersOnline"] + 1;
    // At this position, execute an SQL command to update the value
    Application.UnLock();
}

否则,对于每个用户,会话变量将具有新值,并且您将无法实现此目的。会话变量从未被设计用于此类目的,您可以访问变量,但您不能依赖它们来执行此类任务。您可以从MSDN的SqlClient namespace library获得有关.NET框架中SQL命令的更多指导。

答案 3 :(得分:0)

也许我错过了什么,但为什么不是这样的:

public void Session_OnStart()
{
Application.Lock();

    if (Application["UsersOnline"] == null )
    {
       Application["UsersOnline"] = 0
     }


Application["UsersOnline"] = (int)Application["UsersOnline"] + 1;
Application.UnLock();

}

答案 4 :(得分:0)

也许我错过了一些东西,但您是否有理由不想使用像谷歌分析这样的东西?

除非您正在寻找更多可查询的数据,否则我会建议其他人拥有的数据;将登录计数存储到数据存储。请记住,当用户注销或会话超时时,您还必须要减少该计数器。

答案 5 :(得分:0)

试试这个。它可能对你有帮助。

debug="true" debuglevel="lines,vars,source"

现在您可以显示用户数(没有Loggedin):

namespace EventsNDelegates
  {
   public delegate void DelEventHandler();

   public partial class Form1 : Form

    {
    public event DelEventHandler add;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        add += new DelEventHandler(Initiate);
        //invoke the event  
        add();
    }
    public void Initiate()
    {
        textBox1.Text = "Hello";
    } 
  }
}

和在线用户数量:

namespace EventsNDelegates
{
class Class1
{

}
}