Membership.GetNumberOfUsersOnline() не возвращает правильные значения

В основном мне нужно ограничить количество зарегистрированных пользователей в моем приложении. Что я делаю, так это использую Membership.GetNumberOfUsersOnline(). Я получаю количество зарегистрированных пользователей при аутентификации нового пользователя. Я проверяю количество онлайн-пользователей до числа, которое я хочу ограничить. Membership.GetNumberOfUsersOnline() отлично работает, когда новый пользователь входит в систему, проблема возникает, когда пользователь выходит из системы, значение Membership.GetNumberOfUsersOnline() не уменьшается автоматически. Я просмотрел msdn и обнаружил, что этот метод проверяет время последней активности пользователя, которое не поддерживает событие выхода из системы. Есть ли другой способ в Membership провайдерах ограничить количество пользователей. Я использую службы Silverlight и REST. Я использую Membership.GetNumberOfUsersOnline() на стороне сервера.

Спасибо заранее.


person Rajat Saini    schedule 12.07.2012    source источник


Ответы (3)


Добавьте новый столбец с именем status в вашу пользовательскую таблицу в базе данных. Тип данных этого столбца статуса бит (1/0). Каждые 15 минут проверяйте, что нет пользователей в сети. Используйте таймер в коде за страницей. Проверьте таймер и каждые 15 минут поднимайте это конкретное событие.

person Sibasis jena    schedule 12.07.2012
comment
Спасибо за ответ, но я использую таблицы членства. Стоит ли изменять эти таблицы? - person Rajat Saini; 12.07.2012
comment
Я не говорю модифицировать. Вы можете добавить дополнительный столбец в эту таблицу. - person Sibasis jena; 12.07.2012
comment
Ты прав. Добавление столбцов не причинит вреда, как предложил Сибасис. Но не изменяйте ничего, что было ранее создано asp.net. - person Theo; 12.07.2012

Вы можете попробовать ASP.NET C# Visitor Real-time Session Tracker от Sarin по адресу http://www.sarin.mobi/2008/11/aspnet-csharp-visitor-real-time-session-tracker/

person Tola    schedule 12.07.2012

Я предполагаю, что вы используете 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 всего за пару дополнений.

person Theo    schedule 12.07.2012