访问者数量会因点击而增加,但每次关闭浏览器时,访问者数量都不会减少
我的测试步骤
1)点击浏览器上的f5,访问者人数增加1
2)打开另一个浏览器,访客数量再次增加,当前访客数量为23)再打开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();
}
答案 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在另一个答案中说了什么