Pergunta

Estou executando um site ASP.NET na minha caixa de desenvolvimento (.NET 2.0 no Vista/iis7). O método session_start no global.asax.cs registra todas as chamadas para um arquivo (log4net). O método session_end também registra todas as chamadas.

Estou usando o estado da sessão no prato e defina o tempo limite da sessão para 5 minutos (para evitar esperar por 20 minutos).

Aproveitei o site, aguarde 5 minutos de unidade, vejo o log de session_end. Então eu f5 o site. Os navegadores ainda têm o cookie da sessão e o envia para o servidor. Session_start é chamado e uma nova sessão é criada usando o mesmo ID da sessão (BTW: eu preciso que este seja o mesmo ID da sessão, porque é usado para armazenar dados no banco de dados).

Resultado: Toda vez que clico em F5 em uma sessão anteriormente encerrada, o método session_start é chamado, a solicitação é executada e o método session_end é chamado imediatamente.

Quando abro um navegador diferente, o método session_start é chamado apenas uma vez. Depois de 5 minutos, o session_end cada f5 faz com que a sequência session_start/request/session_end seja executada.

Web.config Seção relevante:

<system.web>
  <compilation debug="true" />
  <sessionState timeout="2" regenerateExpiredSessionId="false" />
</system.web>
Foi útil?

Solução

o regenerateExpiredSessionId A configuração está relacionada a apenas URLs de cozinha, isso não afeta o comportamento de um cookie de sessão que será reutilizado.

O problema que você está enfrentando é por causa da maneira como o ASP.NET 2.0/3.5 lida com sessões com base no uso. Em circunstâncias normais, ele não tenta persistir uma sessão até a primeira vez que é usada e, portanto, não emite um cookie de sessão (se não existir). A primeira sessão é Usado, uma sessão é criada no servidor e um cookie de sessão emitido.

Agora, quando uma sessão anterior é reiniciada, mas não usada, o ASP.NET fica um pouco confuso. Ele tenta abandonar a sessão não utilizada (reiniciada) imediatamente, pois não é necessária, o que levanta uma sessão antecipada. No entanto, ele não exclui o cookie de sessão pré-existente e, portanto, cada solicitação subsequente repete a sequência, reiniciando e encerrando a sessão até que o cookie seja excluído ou a sessão seja usada.

No .NET 4.0, esse comportamento mudou e o evento não é mais disparado neste caso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top