Qual é a maneira mais fácil e não obstrutiva de manter uma sessão ASP.NET ativa enquanto o usuário estiver com a janela do navegador aberta? São chamadas AJAX cronometradas? Eu quero evitar o seguinte: às vezes os usuários mantêm a janela aberta por um longo tempo, depois inserem coisas e, ao enviar, nada funciona mais porque a sessão do lado do servidor expirou. Não quero aumentar o valor do tempo limite por mais de 10 minutos no servidor, pois quero que as sessões fechadas (fechando a janela do navegador) atinjam o tempo limite rapidamente.
Sugestões, amostras de código?
Respostas:
Eu uso JQuery para realizar uma chamada AJAX simples para um manipulador HTTP fictício que não faz nada além de manter minha sessão viva:
O manipulador de sessão pode ser tão simples quanto:
A chave é adicionar IRequiresSessionState, caso contrário, a Sessão não estará disponível (= null). O manipulador pode, é claro, também retornar um objeto serializado JSON se alguns dados devem ser retornados ao JavaScript de chamada.
Disponibilizado através do web.config:
adicionado de balexandre em 14 de agosto de 2012
Gostei tanto deste exemplo que quero melhorar com o HTML / CSS e a parte da batida
mude isso
para dentro
e adicione
HTML e CSS
aqui está um exemplo ao vivo apenas para a parte de espancamento: http://jsbin.com/ibagob/1/
fonte
DateTime.Now
era apenas para deixar claro quando a sessão foi atualizada pela última vez por meio da pulsação.Se você estiver usando ASP.NET MVC - você não precisa de um manipulador HTTP adicional e algumas modificações do arquivo web.config. Tudo que você precisa - apenas para adicionar alguma ação simples em um controlador Home / Comum:
, escreva um código JavaScript como este (coloquei em um dos arquivos JavaScript do site):
e inicialize essa funcionalidade chamando uma função JavaScript:
Observe! Implementei essa funcionalidade apenas para usuários autorizados (não há razão para manter o estado da sessão para convidados na maioria dos casos) e a decisão de manter o estado da sessão ativo não se baseia apenas em - o navegador está aberto ou não, mas o usuário autorizado deve realizar alguma atividade no site (mova o mouse ou digite alguma tecla).
fonte
@Url.Action("KeepSessionAlive","Home")
na função de inicializador para não ter que codificar a URL e também lançar o primeiro bloco dentro de um IIFE e apenas exportar, umaSetupSessionUpdater
vez que é a única coisa que precisa ser chamada externamente - algo como este: SessionUpdater.jssetInterval(KeepSessionAlive, 300000)
Sempre que você faz uma solicitação ao servidor, o tempo limite da sessão é redefinido. Portanto, você pode apenas fazer uma chamada ajax para um manipulador HTTP vazio no servidor, mas certifique-se de que o cache do manipulador esteja desabilitado, caso contrário, o navegador armazenará seu manipulador em cache e não fará uma nova solicitação.
KeepSessionAlive.ashx.cs
.JS:
@veggerby - Não há necessidade de sobrecarga de armazenamento de variáveis na sessão. Basta fazer uma solicitação ao servidor.
fonte
Você realmente precisa manter a sessão (você tem dados nela?) Ou é suficiente fingir isso reinstanciando a sessão quando uma solicitação chega? Se for o primeiro, use o método acima. Se for o segundo, tente algo como usar o manipulador de eventos Session_End.
Se você tiver autenticação de formulários, obterá algo em Global.asax.cs como
E você define o tempo de vida do tíquete muito mais do que o da sessão. Se você não estiver autenticando ou usando um método de autenticação diferente, existem truques semelhantes. A interface da web do Microsoft TFS e o SharePoint parecem usar isso - a verdade é que, se você clicar em um link em uma página desatualizada, receberá prompts de autenticação na janela pop-up, mas se você apenas usar um comando, funciona.
fonte
você pode simplesmente escrever este código em seu arquivo de script java, é isso.
Este
(20-1)*60*1000
é o tempo de atualização, ele irá atualizar o tempo limite da sessão. O tempo limite de atualização é calculado como tempo limite padrão de iis = 20 minutos, significa 20 × 60.000 = 1.200.000 milissegundos - 60.000 milissegundos (um minuto antes de a sessão expirar) é 1140000.fonte
Aqui está uma solução alternativa que deve sobreviver se o PC cliente entrar no modo de hibernação.
Se você tiver uma grande quantidade de usuários conectados, use isso com cautela, pois isso pode consumir muita memória do servidor.
Depois de fazer o login (eu faço isso no evento LoggedIn do controle de login)
fonte
Passei alguns dias tentando descobrir como prolongar a sessão de um usuário em WebForms por meio de uma caixa de diálogo pop-up, dando ao usuário a opção de renovar a sessão ou permitir que ela expire. A primeira coisa que você precisa saber é que não precisa de nenhuma dessas coisas sofisticadas de 'HttpContext' acontecendo em algumas das outras respostas. Tudo que você precisa é $ .post () do jQuery; método. Por exemplo, durante a depuração, usei:
e em seu site ativo você usaria algo como:
É tão fácil quanto isso. Além disso, se desejar solicitar ao usuário a opção de renovar a sessão, faça algo semelhante ao seguinte:
Não se esqueça de adicionar a caixa de diálogo ao seu html:
fonte
Em relação à solução veggerby, se você está tentando implementá-la em um aplicativo VB, tome cuidado ao tentar executar o código fornecido por meio de um tradutor. O seguinte funcionará:
Além disso, em vez de chamar a função heartbeat () como:
Em vez disso, chame-o assim:
Número um, setTimeout dispara apenas uma vez, enquanto setInterval dispara repetidamente. Número dois, chamar heartbeat () como uma string não funcionou para mim, enquanto chamá-lo como uma função real funcionou.
E posso confirmar 100% que esta solução superará a decisão ridícula do GoDaddy de forçar uma sessão de apppool de 5 minutos no Plesk!
fonte
Aqui, a versão do plugin JQuery da solução Maryan com otimização de alças. Apenas com JQuery 1.7+!
e como isso importa em seu arquivo * .cshtml
fonte
[Atrasado para a festa ...]
Outra maneira de fazer isso sem a sobrecarga de uma chamada Ajax ou manipulador WebService é carregar uma página ASPX especial após um determinado período de tempo (ou seja, antes do tempo limite do estado da sessão, que normalmente é de 20 minutos):
A
KeepAlive.aspx
página é simplesmente uma página vazia que não faz nada além de tocar / atualizar oSession
estado:Isso funciona criando um
img
elemento (imagem) e forçando o navegador a carregar seu conteúdo daKeepAlive.aspx
página. Carregar essa página faz com que o servidor toque (atualize) oSession
objeto, estendendo a janela de tempo de expiração da sessão (normalmente por mais 20 minutos). O conteúdo real da página da web é descartado pelo navegador.Uma forma alternativa, e talvez mais limpa, de fazer isso é criar um novo
iframe
elemento e carregar aKeepAlive.aspx
página nele. Oiframe
elemento é oculto, por exemplo, tornando-o um elemento filho de umdiv
elemento oculto em algum lugar da página.A atividade na própria página pode ser detectada interceptando ações do mouse e do teclado para todo o corpo da página:
Não posso levar o crédito por essa ideia; consulte: https://www.codeproject.com/Articles/227382/Alert-Session-Time-out-in-ASP-Net .
fonte