通过观看增加访问者数量

时间:2012-02-09 05:17:30

标签: c# asp.net

访问者数量会因点击而增加,但每次关闭浏览器时,访问者数量都不会减少

我的测试步骤

1)点击浏览器上的f5,访问者人数增加1

2)打开另一个浏览器,访客数量再次增加,当前访客数量为2

3)再打开1个浏览器,现在访问者总数为3

4)关闭1个浏览器,右边访客数量应减少1个

5)我在打开的浏览器上点击刷新

6)现有浏览器的访客总数= 3

7)访客总数从未减少=(

     private static int member = 0;
     private static int visitor = 0;
void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup

    Application["Member"] = member;



   Application["Visitor"]=visitor;




}



void Session_Start(object sender, EventArgs e) 
{
    // Code that runs when a new session is started
    visitor += 1;
    Application.Lock();

    Application["Visitor"] = visitor;

    Application.UnLock();


}

   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.


    visitor -= 1;

    Application.Lock();

    Application["Visitor"] = visitor;

    Application.UnLock();




}

2 个答案:

答案 0 :(得分:0)

关闭浏览器窗口将结束会话,因为当发生这种情况时,实际上没有任何请求发送到服务器。只有当用户在您设置的会话超时期限内没有任何活动时,会话才会结束。

理论上,您可以使用javascript捕获窗口关闭,然后向您设置的处理程序发出AJAX请求,并让该处理程序结束会话。但这不是默认行为,坦率地说,我认为这甚至不可取。

由于您似乎对维护“活动”用户列表感兴趣,您可能只想将会话超时设置为非常低(可能是1分钟)。

答案 1 :(得分:0)

您不应同时使用静态变量和ApplicationState。

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup

   Application["Visitor"]=0;
}

void Session_Start(object sender, EventArgs e) 
{
    Application.Lock();
    Application["Visitor"] = ((int)Application["Visitor"]) + 1;
    Application.UnLock();
}

void Session_Start(object sender, EventArgs e) 
{
    Application.Lock();
    Application["Visitor"] = ((int)Application["Visitor"]) - 1;
    Application.UnLock();
}

还要看看dlev在另一个答案中说了什么