Obter Sessão ASP.NET Access Time (ou Time-to-Timeout)
-
16-09-2019 - |
Pergunta
Eu estou tentando determinar quanto tempo é deixado em uma determinada sessão ASP.NET até que ela expire.
Se não houver prontamente disponível valor time-to-timeout, eu poderia também calculá-lo a partir de seu último tempo de acesso (mas eu não achei isso também). Alguma idéia de como fazer isso?
Solução
Se você está no servidor, o processamento do pedido, em seguida, o tempo de espera foi apenas redefinido para que os completos 20 minutos (ou o que você configurou) permanecem.
Se você quiser um aviso do lado do cliente, você precisará criar algum código javascript que vai disparar cerca de 20 minutos do "agora". Veja o método setTimeout.
Eu tenho usado isso para exibir um aviso, a 15 minutos depois que a página foi solicitada. Ele aparece um alerta como "sua sessão irá expirar em {HH: mm}, por favor, salve o seu trabalho". O tempo exato foi utilizado em vez de "em 5 minutos" como você nunca sabe quando o usuário verá a mensagem (que ele retornar ao seu computador 10 minutos após o alerta demitido?).
Outras dicas
Para multi-page solução pode-se economizar última vez pedido no cookie e javascript pode considerar este último tempo de acesso para manipulação de mensagem de aviso ou de login fora de ação.
Você pode obter o tempo limite em minutos a partir de:
Session.Timeout
Não é este o suficiente para fornecer as informações, como o tempo limite é redefinir cada pedido? Não sei como você quer mostrar este sem fazer um pedido?
De qualquer forma, o melhor caminho é em cada solicitação definindo alguns variável de sessão com o último tempo de acesso. Que deve fornecer as informações sobre remoto.
acabo implementou uma solução como a que perguntou sobre aqui e parece trabalho. Tenho uma aplicação MVC
e tenho esse código em minha página _Layout.chtml mas poderia trabalhar em um aplicativo asp.net
, colocando-o na página mestra eu pensaria. Eu estou usando armazenamento de sessão local via o plugin amplify.js
. I usar o armazenamento de sessão local porque, como diz o Sr. Grieves poderia haver uma situação onde um usuário está acessando o aplicativo de uma forma que não cause uma atualização de página ou redirecionamento mas ainda redefine o tempo limite da sessão no servidor.
$(document).ready(function () {
var sessionTimeout = '@(Session.Timeout)'; //from server at startup
amplify.store.sessionStorage("sessionTimeout", sessionTimeout);
amplify.store.sessionStorage("timeLeft", sessionTimeout);
setInterval(checkSession, 60000); // run checkSession this every 1 minute
function checkSession() {
var timeLeft = amplify.store.sessionStorage("timeLeft");
timeLeft--; // decrement by 1 minute
amplify.store.sessionStorage("timeLeft", timeLeft);
if (timeLeft <= 10) {
alert("You have " + timeLeft + " minutes before session timeout. ");
}
}
});
Então, em uma página onde os usuários nunca causar uma atualização de página, mas ainda bateu o servidor causando uma redefinição de sua sessão eu colocar isso em um evento de clique de botão:
$('#MyButton').click(function (e) {
//Some Code that causes session reset but not page refresh here
amplify.store.sessionStorage("sessionTimeout", 60); //default session timeout
amplify.store.sessionStorage("timeLeft", 60);
});
Usando armazenamento de sessão local permite que meu código _Layout.chtml para ver que a sessão foi redefinida aqui, embora uma página nunca foi atualizado ou redirecionados.