2010-08-13 3 views
5

Как мне отслеживать количество текущих сеансов на моем сайте?Отслеживать, кто сейчас на сайте

+5

Отчасти это зависит от вашего определения. Мы могли бы говорить о количестве текущих сеансов или о регистрации в течение последнего месяца или о фактическом вкладе в течение последних X-дней. Пожалуйста, предоставьте немного больше информации о том, что именно вы хотите измерить. – kbrimington

ответ

2

Если вы просто хотите знать, кто просматривает страницы на небольшом сайте rinky-dink, один из способов - иметь список последних запросов (или статических) в списке приложений, а также дату/время запроса , Всякий раз, когда кто-то запрашивает страницу, удаляет все «старые» хиты (старше X минут) и добавляет (или обновляет) информацию о посетителе с датой/временем,

Обратите внимание, что для действительно загруженного сайта, это, вероятно, будет плохой идеей. Несколько более масштабируемым решением будет иметь столбец «последнего посещения» в вашей таблице пользователей и обновлять его всякий раз, когда пользователь запрашивает страницу. Но это не помогло бы отслеживать анонимных/не зарегистрированных пользователей.

В любом случае, чтобы узнать, кто «активен», вы просматриваете данные и находите все посещения/пользователи с последним посещением меньше, чем X минут назад, где X - это номер, который вы считаете подходящим. Обычно 20-60 минут достаточно хороши.

0

Очень простой способ - следить за последним действием каждого пользователя. После периода отсутствия активности вы говорите, что этот пользователь больше не активен.

0

Одним из простых способов было бы написать небольшой модуль http (или даже воспользоваться global.asax), который управляет созданием сеанса и завершением сеанса обновления таблицы коллекции или базы данных всех активных пользователей и когда сеанс завершается, чтобы удалить запись.

RE: Когда сессия заканчивается, вы все равно должны иметь доступ к самому сеансу или, по крайней мере, идентификатору сеанса либо из свойства отправителя, либо из свойства eventargs. Это даст вам простой способ связать сеанс asp.net с пользователем с помощью идентификатора сеанса. Вы можете легко протестировать это, запустив приложение в отладке, а в непосредственном окне - Session.Abandon(); для запуска этого события программно, чтобы увидеть, как это происходит с живым кодом, который вы можете отлаживать.

Примечание. Я не уверен в 100% об использовании отправителя/аргументов, но вы должны иметь доступ к самому сеансу непосредственно внутри global.asax SessionEnd от этого. Сеанс, который должен быть доступен (обязательно не используйте HttpContext.Current.Session, потому что контекст не существует).

+0

Пробовал это, и он не работает так хорошо. Когда сеанс заканчивается таймаутом, вы получаете событие, завершившее сеанс, после того, как сеанс исчез, поэтому вы не знаете, какой сеанс закончился. –

0

Одна вещь, которую вы могли бы сделать, это реализовать свой собственный SessionStateStoreProvider: http://msdn.microsoft.com/en-us/library/ms178587.aspx

В вашей реализации GetItem, вы бы обновить свою собственную коллекцию текущих данных сессии и в вашей реализации RemoveItem, у вас есть доступ к ASP .NET Session, поэтому вы можете удалить элемент из своей коллекции до удаления сеанса ASP.NET обычным способом. Вы можете запросить свою коллекцию для активных сеансов.

RemoveItem

В качестве альтернативы:

Если вы используете ASP.NET поставщика членства, вы можете запросить базу данных с чем-то вдоль линий:

Create Procedure dbo.GetCurrentUsers 
@ActiveSince DateTime 
AS 
    SELECT U.UserId, U.UserName, M.Email 
    FROM aspnet_Users U 
    INNER JOIN aspnet_membership M ON M.UserId = U.UserId 
    WHERE U.LastActivityDate > @ActiveSince 
GO 

Вы бы установить @ActiveSince, чтобы быть текущим DateTime минус таймаут сеанса на вашем сайте.

var sessionState = (System.Web.Configuration.SessionStateSection) 
       ConfigurationManager.GetSection("system.web/sessionState"); 
DateTime activeSince = DateTime.Now.AddMinutes(0 - sessionState.Timeout.TotalMinutes); 

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

0

Я бы справился с этим в основном внутри Global.asax. Добавьте Session_Start в глобальный список приложений, содержащий данные, которые вы хотите отслеживать (например, User, SessionId, StartTime, LastRequestTime).

Когда пользователь впервые попадает на сайт, Session_Start добавит запись в GlobalList. Это будет уверен, что каждый уникальный пользователь получит свою собственную запись (дескать, тоже неприятно). Если вы хотите, как только пользователь войдет в систему, вы можете обновить GlobalList, чтобы установить информацию о пользователе (имя, идентификатор, что угодно).

Далее, приложение Application_Start запустит фоновый поток, который проходит через глобальный список и удаляет все элементы, срок действия которых истекает (на основе любого установленного порога, TimeSpan от LastRequestTime-StartTime).

Если вы хотите развернуть это в сценарии WebFarm, вам придется переместить список в свою базу данных.

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