Como para ser notificado de fim de sessão?
Pergunta
Eu estou querendo saber se eu posso lidar com um evento de tempo limite da sessão. Eu preciso fazer uma chamada de função para a minha função logo antes de tempo limite de sessão ou usuário deixou minha página, ou janela do navegador fechado. A parte mais importante aqui é ter acesso a tudo armazenado durante a sessão, variáveis ??de sessão.
Solução
Dê uma olhada no método Session_End () em global.asax. O arquivo global já deve estar ligado a chamar esse método quando a sessão termina. Você pode apenas colocar o seu código lá no entanto você gostaria.
Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
' Fires when the session ends
End Sub
Claro, você deve observar que a sessão é inteiramente uma coisa do lado do servidor. Ele só vai acabar após X minutos de inatividade (20 minutos é o padrão). Não vai acabar no instante em que o usuário fecha a janela. ASP.NET não tem conhecimento de um usuário fechar uma janela ou sair da página.
E, de fato, é complicado para tentar executar qualquer ação imediata no lado do servidor quando isso acontece. Quero dizer, é fácil window.onbeforeunload chamada em Javascript e abrir uma caixa de confirmação antes que o usuário fecha a janela. Mas quando você tenta enviar um pacote para o servidor imediatamente antes da janela, na verdade, fecha, eu acho que você vai achar que ela se torna uma tarefa difícil de fazer isso tudo user-friendly. Você poderia escrever algum Javascript que envia uma mensagem para o servidor usando AJAX que notifica o servidor que o usuário está fechando o seu browser e, em seguida, usar mais o Javascript para fechar o navegador depois que a mensagem foi enviada. Mas, então, o usuário receberá a mensagem irritante (na maioria dos navegadores) afirmando que um script está tentando fechar a janela. Isso será muito amador-ish para o usuário e pode fazê-los pensar duas vezes antes de voltar.
Então, se você está disposto a colocar-se com um atraso, eu tinha acabado de evitar toda essa confusão Javascript totalmente e confiar em uma solução do lado do servidor puro utilizando Session_End (). Afinal, se um usuário fecha a janela ou folhas, ASP.NET irá , eventualmente aviso porque a sessão será tempo limite.
Outras dicas
Session_End irá lidar com o tempo da sessão a questão. No entanto, isso não irá disparar quando o usuário fecha o navegador ou se move para uma URL diferente. Ele espera até que o tempo limite da sessão expirar.
A fim de detectar as outras condições, você terá que usar javascript no cliente. No entanto, estes métodos nem sempre são confiáveis, dependendo do navegador / versão, etc. Além disso, se computador é desligado do usuário para baixo, é desconectado, ou que de outra forma completamente ir embora esse script não irá fogo.
Você pode considerar outras alternativas. O que exatamente você está tentando realizar com esta função?
A web é apátrida para que você não vai saber se o usuário tenha fechado a janela do navegador. Você pode usar o evento 'Session_End' no arquivo global de tempo limite de sessão. Se você quer acesso a todas as sessões, você pode armazená-los em uma coleção através do evento 'Session_Start', também no arquivo mundial ..
Edit: Se você quiser interceptar o próximo evento de uma página usando javascript, aqui está como (nota, este não é confiável):
window.onbeforeunload = closeIt;
function closeIt(){
return "You have unsaved changes. Are you sure you want to leave this page?";
}
Você poderia ter um BasePage que é herdado por cada página aspx e em sua página base evento init apenas verificar se há uma variável de sessão para nada. Se isso não é nada, então isso significa sessão expirou e você pode redirecionar usuário para uma página de login.