Определение количества активных пользователей сайта ASP.NET - PullRequest
5 голосов
/ 26 марта 2009

На сайте ASP.NET, какие методы можно использовать для отслеживания количества пользователей, вошедших на сайт в любой данный момент времени?

Так, например, я мог бы создать отчет, показывающий что-то вроде этого:

        10:00am  11:00am  12:00pm  1:00pm  2:00pm ....
 3/25      25      32       45      40      37
 3/26      31      38       50      57      40
 3/27      28      37       46      35      20
 etc. 

РЕДАКТИРОВАТЬ: Нет, мы не используем поставщика членства ASP.NET, он использует доморощенный / хакерский метод, основанный на сеансах, для определения, находится ли пользователь в состоянии «залогинен».

Ответы [ 9 ]

8 голосов
/ 26 марта 2009

Входил ли пользователь на сайт? Если это так, то вы можете обновлять поле «Последнее посещение» в пользовательской таблице каждый раз, когда они запрашивают новую страницу, а затем каждый час просто выполнять SQL-запрос, который собирает всех, у кого есть отметка времени «Последнее посещение» в течение последнего 15 минут или около того (предполагается, что в настоящее время на сайте).

Если у вас нет людей, войти в систему, вы могли бы так же легко сделать это по IP-адресу вместо имени пользователя. Однако при использовании этого метода вы можете столкнуться с некоторыми проблемами с прокси-сервером (т. Е. Все пользователи из одной корпоративной сети могут приходить с одного IP-адреса, поэтому они учитываются только как один пользователь в ваших итогах), но это должно быть минимальным. 1003 *

3 голосов
/ 26 марта 2009

Это зависит от вашего сайта. Если вы используете провайдеров членства ASP.Net, существует метод: Membership.GetNumberOfUsersOnline(), который может сказать вам, сколько есть зарегистрированных пользователей. Я считаю, что есть также счетчики производительности. Понятие вошедшего в систему пользователя - это пользователь, который сделал что-то за последние x минут, где x настраивается.

Вы также можете использовать счетчики производительности для отслеживания входящих запросов, если хотите получить представление о том, насколько активна активность.

Редактировать

Точно так же вы знаете, что поставщики членства в SQL ASP реализуют это, записывая дату активности в поле в БД. Это когда просто запрашивает его для всей деятельности в течение х минут.

Я добавил функцию опроса на стороне клиента, которая подключается к нашему серверу каждые 2 минуты, поэтому, пока пользователь сидит на странице, я знаю, что он там есть, даже если нет активности. Это также позволяет мне вывести пользователя из системы, предоставляя способ доставки других системных сообщений. Вроде приятно.

2 голосов
/ 27 мая 2010

Если вы используете SQL Server для хранения сеансов (т. Е. Режим <sessionState> - это «SQLServer» в web.config), вы не можете использовать решение, основанное на Session_End в global.asax , так как метод никогда не будет вызван.

Однако, предполагая, что Агент SQL правильно выполняет задание DeleteExpiredSessions (что должно быть по умолчанию при установке состояния SQL), вы можете просто запустить следующий SQL для Сессия Db:

SELECT COUNT(SessionId) FROM ASPStateTempSessions
1 голос
/ 16 декабря 2016

На Global.asax

protected void Application_Start(object sender, EventArgs e)
        {
            Application["SessionCount"] = 0;
        }

        protected void Session_Start(object sender, EventArgs e)
        {
            Application.Lock();
            Application["SessionCount"] = Convert.ToInt32(Application["SessionCount"]) + 1;
            Application.UnLock();
        }

        protected void Session_End(object sender, EventArgs e)
        {
            Application.Lock();
            Application["SessionCount"] = Convert.ToInt32(Application["SessionCount"]) - 1;
            Application.UnLock();
        }

Получите приложение ["SessionCount"] на нужной странице

1 голос
/ 26 марта 2009

Есть монитор производительности статистика для Активные сеансы в объектах производительности ASP.NET, и вы можете отслеживать все экземпляры или отдельные приложения. Вы можете получить доступ к этой статистике через Инструменты администратора Производительность или программно через WMI .

Очень простой скрипт PowerShell для получения такого количества таких счетчиков:

(Get-WmiObject Win32_PerfRawData_ASPNET_ASPNETApplications SessionsActive).SessionsActive

Фильтр должен иметь возможность получать статистику для определенного сайта.

1 голос
/ 26 марта 2009

Я думаю, что раньше я использовал функции Global.asax, в основном сосредоточенные вокруг Session_Start и Session_End, увеличивая счетчик с помощью Start, а затем конец немного сложен из-за тайм-аута сеанса. Если вас не очень беспокоит, насколько точен счет, тогда вы можете остановиться здесь.

Если нет, то вы, вероятно, использовали бы комбинацию события javascript onUnload с неким ajax-запросом, чтобы аннулировать сеанс и вычесть пользователя. Событие должно было бы увидеть, действительно ли пользователь покидает страницу или просто переходит на другую страницу сайта.

Во всяком случае, начните там. Я помню, что имел дело с ASP-сайтами, поэтому определенно есть некоторая информация об этом методе.

0 голосов
/ 26 ноября 2016
public class ActiveUsers
{
    private static List<LastUserActivity> users;
    private static object syncroot = new object();
    private static DateTime lastPruned;

    public static int SessionLength = 20;

    static ActiveUsers()
    {
        users = new List<LastUserActivity>();
        lastPruned = DateTime.UtcNow;
    }

    public void RecordUserActivity(int userId)
    {
        lock (syncroot)
        {
            var user = users.FirstOrDefault(x => x.UserId == userId);
            if (user == null)
            {
                user = new LastUserActivity() { UserId = userId };
                users.Add(user);
            }
            user.UtcTime = DateTime.UtcNow;

            if (lastPruned.AddMinutes(5) < DateTime.UtcNow)
            {
                Prune();
                lastPruned = DateTime.UtcNow;
            }
        }
    }

    private static void Prune()
    {
        users.RemoveAll(x => x.UtcTime.AddMinutes(SessionLength) < DateTime.UtcNow);
    }

    public int GetActiveUsers()
    {
        return users.Count;
    }
}
public class LastUserActivity
{
    public int UserId { get; set; }
    public DateTime UtcTime { get; set; }
}

Добавьте вызов к ActiveUsers в метод в global.asax (например, BeginRequest, AcquireRequestState).

0 голосов
/ 26 марта 2009

Если вы используете состояние сеанса InProc, вы можете сделать это в global.asax

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
    Application("ActiveSessionCount") = 0
End Sub

Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
    Application("ActiveSessionCount") += 1
End Sub

Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
    Application("ActiveSessionCount") -= 1
End Sub

Чтобы получить доступ к значению в веб-форме просто так

Dim Count as Integer = Application("ActiveSessionCount")
0 голосов
/ 26 марта 2009

Первый тайм-аут сеанса на 1 минуту.

Создайте простую страницу heartbeat.aspx без HTML-содержимого, только следующий код javascript:

<html>
  <head>
  <script language="javascript">
  function reloadPage()
  {
    window.navigate("heartbeat.aspx");
  }
  </script>
  </head>
<body onload="window. setTimeout(‘reloadPage()’, 30000)">
</body>
</html>

Это будет повторять запрос каждые 30 секунд и поддерживать сессию.

Поместите страницу heatbeat.aspx в скрытый фрейм.

Чтобы получить количество пользователей, просто получите количество сеансов, используя статический счетчик в событиях Session_Start и Session_End в Global.asax.

...