Вопрос по asp.net – Подсчет пользователей онлайн с использованием asp.net

4

Я хочу создать веб-сайт, для которого мне нужно вести учет пользователей онлайн и постоянно показывать его на главной странице. Мне не интересно применять готовые к использованию модули для него. Вот что я уже сделал:

Добавление файла Global.asax в мой проект

Написание следующего фрагмента кода в файле Global.asax:

<code>void Application_Start(object sender, EventArgs e) 
{
    Application["OnlineUsers"] = 0;
}

void Session_Start(object sender, EventArgs e) 
{
    Application.Lock();
    Application["OnlineUsers"] = (int)Application["OnlineUsers"] + 1;
    Application.UnLock();
}

void Session_End(object sender, EventArgs e) 
{
    Application.Lock();
    Application["OnlineUsers"] = (int)Application["OnlineUsers"] - 1;
    Application.UnLock();
}
</code>

На самом деле это работает нормально, но я нашел следующую ошибку:   - & GT; Даже если пользователь закрывает браузер, реальное количество онлайн-пользователей не отображается       поскольку тайм-аут сеанса еще жив!

Есть ли решение, кроме изменения интервала времени ожидания сеанса?

Не совсем, вы должны реализовать некоторую логику уведомлений со стороны клиента, чтобы сообщить серверу, что пользователь собирается уйти, но это может быть немного сложно (вот почему я никогда не видел веб-сайт, чтобы сделать это ... ) Adriano Repetti
Вы можете вызвать эту функцию перед началомApplication Session.RemoveAll(); Session.Clear(); Session.Abandon(); любая функция будет работать. Не пробовал, но это должно работать. Murtaza
если пользователь закрывает браузер, вы можете не получить отчет об этом на сервере, если это явно не было сообщено со стороны клиента. Для этого самого случая у нас есть тайм-аут сеанса, который является неявным отчетом о завершении сеанса. Следовательно, чтобы иметь обновленный счетчик, вы должны запускаться со стороны клиента и для этого вы должны использовать любой скрипт Syed Mohd Mohsin Akhtar
The Session_Start/Session_End way has the problem that Session_End is only called for "InProc" sessions, not if the sessions are stored in StateServer or SqlServer. PreguntonCojoneroCabrón

Ваш Ответ

4   ответа
0

Нет, обновление займет некоторое время, пока не истечет время ожидания сеанса ...

0

Ограничение этого подхода заключается в том, что сервер будет считать, что пользователь вошел в систему, если сеанс не завершится фактически; что произойдет только тогда, когда количество минут прошло, как указано в конфигурации тайм-аута сеанса.

Проверьте этот пост:http://forums.asp.net/t/1283350.aspx

Нашел этоОнлайн-активные пользователи встречным-в-ASP-NET

3

Вы могли бы использоватьonUserExit Плагин jQuery для вызова некоторого кода на стороне сервера и прекращения сеанса. Активируйте onUserExit для готового документа:

<script type="text/javascript">
  jQuery(document).ready(function () {

    jQuery().onUserExit({
      execute: function () {
        jQuery.ajax({
          url: '/EndSession.ashx', async: false
        });
      },
      internalURLs: 'www.yourdomain.com|yourdomain.com'
    });
  });
</script>

А в EndSession.ashx отказаться от сеанса и на стороне сервера будет вызываться Session_End:

public void ProcessRequest(HttpContext context)
{
  context.Session.Abandon();
  context.Response.ContentType = "text/plain";
  context.Response.Write("My session abandoned !");
}

обратите внимание, что это не будет охватывать все случаи (например, если пользователь убивает браузер через диспетчер задач).

Не найденоuserfirst.com/creations/onuserexitкакие-нибудь решения?
3

Событие Session_End возникает, когда время сеанса на стороне сервера истекает, что составляет (по умолчанию) 20 минут после того, как последний запрос был обслужен. Сервер НЕ знает, когда пользователь «уходит» или "закрывает браузер", поэтому не может "действовать" на это.

The Session_Start/Session_End way has the problem that Session_End is only called for "InProc" sessions, not if the sessions are stored in StateServer or SqlServer.

Похожие вопросы