Em alguns sistemas web pode ser interessante saber quantos usuários estão on-line, ou seja, quantos usuários estão acessando o sistema em um dado momento. A idéia é ter um contador que seja incrementado cada vez que alguém acessa o sistema e, também, seja decrementado quando um usuário sair do sistema. Para isso precisamos ter um local onde este contador possa ser armazendo e incrementado sempre que um usuário acessar nosso sistema. O problema começa na hora de decrementar quando usuário sai.
É comum que coloquemos no sistema um botão de sair para que o usuário clique e assim o sistema seja informado quando algum usuário fechar o sistema. Mas nem sempre o usuário clica neste botão. Muitas vezes o browser é fechado antes do contador ser decrementado. A insersão de um código em javascript chamando outra página que, por sua vez, faz o decremento do contador pode ser utilizada.
Minha dica é uma solução bem simples, usando o arquivo Global.asax e a classe Application. No arquivo Global.asax contém vários eventos que são disparados em momentos especias durante a execução do site. Veja alguns:
- Application_Error: Disparado sempre que ocorre uma exceção não tratada.
- Application_Start: Disparado quando a aplicação é iniciada. Normalmente no primeiro Request do site, ou seja na primeira vez que o sistema é chamado, após o Start ou Re-Start do servidor Web (IIS).
- Application_End: Disparado quando o sistema web está sendo encerrado. Normalmente isso ocorre quando o servidor web está sendo interrompido por qualquer motivo.
- Session_Start: Disparado quando uma nova sessão de usuário é iniciada.
- Session_End: Disparado quando a sessão de usuário é encerrada.
Esses e outros eventos podem ser utilizados para vários fins.
Falando um pouco sobre a classe Application… Existe algumas maneiras de fazer com que variáveis sejam passadas de uma página pra outra. As duas abaixos são bem interessantes:
- Variáveis de Sessão: Uma sessão é criada sempre que um navegador faz uma chamada para um servidor web, ou seja, sempre que o navegador abre um site. Váriaveis de sessão podem ser criadas e ficam disponíveis em todas as chamadas a páginas do site. A sessão só é encerrada após um tempo de inatividade entre o navegador e o servidor web. Este tempo é configurável. Essas váriaves só são vista na sessão do usuário, ou seja, uma sessão não pode ver o conteúdo de outras sessões. Sessões são criadas no lado do servidor. Essas variáveis são gerenciadas através da classe Session.
- Variáveis de Aplicação: Uma variável de aplicação é vista pela aplicação. Isso significa que enquanto a aplicação tiver ativa a variável está dispníviel. Somente quando o servidor for reiniciado essas variáveis deixam de exisitir. E mais: variáveis de aplicação são vistas por todos usuários da aplicação. No momento que o browser chamar alguma página do site, as variáveis de aplicação estarão disponívies. A classe que gerencia essas variáveis é a classe Application.
Na nossa dica vamos usar uma variável de aplicação para ser nosso contador de usuários on-line, bem como alguns eventos do arquivo Global.asax.
No evento Application_Start do Global.asax vamos criar uma variável de aplicação. Esta variável será inicializada sempre que o servidor der algum re-start.
protected void Application_Start(object sender, EventArgs e)
{
Application.Add(”UsuariosOnLine”, Convert.ToInt32(0));
}
No Evento Session_Start vamos colocar o incrementador do contador. Todas vez que uma nova sessão for criada o contador será incrementado. Poderia deixar pra fazer este incremento após a confirmação do login/senha do usuário. Estamos facilitando as coisas. Note também que estamos colocando o timeout da sessão em 20 minutos. Sem atividade por 20 minutos a sessão expira.
protected void Session_Start(Object sender, EventArgs e)
{
lock (typeof(HttpApplication))
{
int usuariosOnline = Convert.ToInt32(Application.Get(”UsuariosOnLine”));
usuariosOnline++;
Application.Set(”UsuariosOnLine”, usuariosOnline);
}
Session.Timeout = 20;//A sessão expira em 20 minutos
}
Quando a sessão expirar o contador deverá ser decrementado.
protected void Session_End(Object sender, EventArgs e)
{
lock (typeof(HttpApplication))
{
int usuariosOnline = Convert.ToInt32(Application.Get(”UsuariosOnLine”));
usuariosOnline–;
Application.Set(”UsuariosOnLine”, usuariosOnline);
}
}
Adicionei um lock ao processo pra evitar que esse processo seja disparado ao mesmo tempo por dois ou mais usuários diferentes.
Pronto. Muito simples, não acha? Inclusive voce pode acessar a sua variável de aplicação (o contador) de qualquer lugar da sua aplicação para mosta-la em alguma página, informando quantos usuários estão on-line naquele momento. O que está mostrando na realidade são quantas sessões estão abertas.
Se quiser, baixe o arquivo abaixo e veja a implementação que fiz para um sistema que desenvolvi. ATENÇÃO: O arquivo não é um .doc e sim um .zip. Renomei após o download.
É isso aí. Qualquer dúvida é só falar. Se tiver uma proposta melhorada sobre o assunto comente aqui.
Muito fodah, deu certo velho!
Muito bem explicado!
Obrigado!
Como eu faço para colocar este contador na minha pagina
oi, Wendel. Se voce usa .NET não terá problemas. Siga os passos citados acima que deve funcionar. Baixe o arquivo com fontes que pode ajudar bastante.