当用户注销时,application["Usersonline"] 不会减少

When user logsoff, application["Usersonline"] dont decrease

我正在使用我找到的代码 here

当用户正确登录时,它会将值+1,但当用户注销时,它不会减少该值。有人可以告诉我这是什么原因吗?

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        Application["OnlineUsers"] = 0;   
    }

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

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

您计算的不是 logged-in 用户数,而是会话数。在你登录之前,你已经有一个session,在你注销之后,你还有一个session,除非你销毁它。

您可以通过在您的注销代码中调用 Session.Abandon 来强制结束会话,可能在您的 AccountController.

session_end 事件在会话结束时触发,而不是在用户注销时触发。

会话结束:

  1. 超时后服务器未收到该会话的请求。
  2. Session.Abandon 已调用。

当您注销用户时,他们仍然有一个会话,但该会话现在未经身份验证。

您可以调用 Session.Abandon 来强制调用 End 事件。但是请注意,仅当会话存储在 InProc 中时才会触发会话结束事件(来自HttpSessionState.Mode

如果您使用的是内置 ASP.NET 会员提供程序,则有一个方法 Membership.GetNumberOfUsersOnline()