Membership.GetNumberOfUsersOnline()不返回正确的值

时间:2012-07-12 06:20:35

标签: c# session asp.net-membership

我基本上需要限制应用程序中登录用户的数量。我正在做的是使用Membership.GetNumberOfUsersOnline() 我在验证新用户时获取登录用户的数量我将在线用户数量检查到我想要限制的数量。 当新用户登录时,Membership.GetNumberOfUsersOnline()正常工作,当用户注销Membership.GetNumberOfUsersOnline()的值不会自动减少时,会出现问题。我搜索了msdn,发现这个方法检查最后一个用户活动时间,这不支持注销事件。 Membership提供程序中是否还有其他方法可以限制用户数量。 我正在使用SilverlightREST服务。我在服务器端使用Membership.GetNumberOfUsersOnline()

提前完成。

3 个答案:

答案 0 :(得分:1)

您可以在http://www.sarin.mobi/2008/11/aspnet-csharp-visitor-real-time-session-tracker/

尝试Sarin的ASP.NET C#访客实时会话跟踪器

答案 1 :(得分:1)

我假设您正在使用SqlMembershipProvider。如果是这样,这就是我要采取的方向......

创建一个继承SqlMembershipProvider的类并覆盖GetNumberOfUsersOnline()和ValidateUser()方法......

using System.Web.Security;

public class MyMembershipProvider : SqlMembershipProvider
{
    public override bool ValidateUser(string username, string password)
    {
        if (base.ValidateUser(username, password))
        {
            // successfully logged in. add logic to increment online user count.

            return true;
        }

        return false;
    }

    public override int GetNumberOfUsersOnline()
    {
        // add logic to get online user count and return it.
    }
}

现在,如果您使用LoginStatus控件允许用户注销,则可以使用LoggedOut事件在那里添加递减在线用户计数逻辑。

您必须在web.config中使用新的自定义成员资格提供程序。对于您的会员资格的类型属性,请将其从所说的内容(例如type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")更改为类似type="MyNameSpace.MyMembershipProvider"的内容。我认为就是它的全部内容。

此解决方案允许您继续使用SqlMembershipProvider提供程序,只需添加几个。

答案 2 :(得分:0)

在数据库的用户表中添加一个名为status的新列。该状态列的数据类型位(1/0)。在每15分钟检查一次用户是否在线。在页面后面的代码中使用计时器。检查计时器,并在每15分钟内引发一次特定事件