2009-03-26 3 views
5

На сайте ASP.NET какие методы можно использовать для отслеживания того, сколько пользователей вошли на сайт в любой момент времени?Определение «активного» количества пользователей сайта 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. 

EDIT: Нет, мы не используем провайдера ASP.NET членства, он использует доморощенный/Hacky сессии на основе метод определения того, находится ли пользователь в состоянии «вошел в систему».

ответ

8

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

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

+0

И, если сайт открыт для просмотра, есть большие прокси-серверы, такие как AOL и военные. – Amy

+0

Добавление поля «Последнее посещение», частое обновление которого, вероятно, является подходом, который мы в конечном итоге возьмем за этот проект. Спасибо за идею. –

3

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

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

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

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

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

+0

Это хорошая информация, поэтому я +1 к вам, но для моих целей идея rwmnau при условии, что это лучше подходит для моего конкретного сценария. –

+0

Я тоже +1, я не считал, что кто-то опросит клиентскую сторону, чтобы увидеть, все ли они вокруг. Я всегда обнаружил, что последнее обновление страницы - довольно надежный индикатор, но если у вас есть пропускная способность для записи, этот метод еще более точным. – SqlRyan

+0

Мой опроллер на самом деле является методом ограничения одновременного входа в систему ... последний человек остается в сценарии. У нас есть схема лицензирования пользователей для компаний ... вид прохладно ... – JoshBerke

1

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

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

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

1

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

Очень простой скрипт PowerShell, чтобы получить такое общее число таких счетчиков:

(Get-WmiObject Win32_PerfRawData_ASPNET_ASPNETApplications SessionsActive).SessionsActive 

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

+0

Любой пример кода с использованием программно с помощью WMI to ** монитора производительности **? – Kiquenet

0

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

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

<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.

+1

Почему бы просто не попросить асинхронный клиентский запрос (AJAX) попасть на службу на спине или в ashx ... почему есть еще один кадр. – JoshBerke

0

Если вы используете состояние 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

Я пробовал об этом и при каждом обновлении счетчик увеличил –

2

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

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

SELECT COUNT(SessionId) FROM ASPStateTempSessions 
+0

Что такое *** SessionId ***? значение 'HttpContext.Current.Session.SessionID'? – Kiquenet

0
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() 
    { 
     lock (syncroot) 
     { 
      return users.Count; 
     } 
    } 
} 
public class LastUserActivity 
{ 
    public int UserId { get; set; } 
    public DateTime UtcTime { get; set; } 
} 

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

0

На 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(); 
     } 

Get Application [ "SessionCount"] на странице, которую

Смежные вопросы