Dados incorretos da sessão ASP.NET retornados intermitentemente

Dados incorretos da sessão ASP.NET retornados intermitentemente

Recebi a tarefa de investigar um problema em que a sessão de um usuário muda entre as atualizações de uma página. Imediatamente (sem saber nada sobre o site) eu disse que parecia um problema de balanceamento de carga/configuração de cluster da web. No entanto, descobri mais tarde que o site não tem balanceamento de carga - é um servidor único.

A aplicação possui um objeto Basket que é armazenado em Session. O usuário adiciona itens à cesta etc. Quando estiver na página da cesta, se a página for atualizada, os itens que estão na cesta mudam e às vezes não há nenhum.

A sessão não se perde, quase sempre volta na próxima atualização, mas a cesta pode ficar vazia ou ter conteúdo diferente na próxima atualização. Já vi esse comportamento muitas vezes, mas apenas em configurações de vários servidores.

Isso é algo que tentamos replicar em um ambiente de desenvolvedor sem sucesso - simplesmente não conseguimos replicar o problema, mas ao vivo isso acontece muito.

O aplicativo Web é um site ASP.NET WebForms, executado em .NET 4.0 no Windows Server 2008 R2 e IIS 7.5.

O modo de estado da sessão é InProc e o tempo limite da sessão é definido como 480 minutos.

Usei o violinista para examinar as solicitações e respostas e o ID de sessão do ASP.NET passado ao servidor é sempre o mesmo. Parece não haver diferença entre as respostas além do HTML real retornado.

Alguém tem alguma idéia sobre o que poderia causar esse problema?

Atualização 1:

Refiz alguns dos registros que um colega implementou no código da cesta. Agora posso ver que o ID da sessão permanece o mesmo, o valor da variável Session também permanece o mesmo, mesmo que dados diferentes sejam exibidos.

Desculpe, eu deveria ter verificado o registro deles antes de postar isso.

Estou convencido de que este é um problema do servidor, o código funciona conforme esperado em nosso ambiente de teste.

Responder1

"Eu disse que parece um problema de balanceamento de carga/configuração de cluster da web. No entanto, descobri mais tarde que o site não tem balanceamento de carga - é um servidor único."

Só porque é um servidor único não significa que não haja balanceamento de carga em andamento. O IIS possui um recurso chamado "Web Garden", que divide o trabalho da Web em mais de um processo, para que possa ser distribuído por várias CPUs.

É como uma pequena “Web Farm” – daí o nome “Web Garden”. :)

Um efeito ao usar um Web Garden é que ele faz com que as variáveis ​​de sessão InProc parem de funcionar corretamente, pois você pode acabar em um processo de trabalho diferente em cada solicitação de página. InProc (In Process) só funciona de forma confiável se você sempre acabarno mesmo processo.

Solução 1:

  • Certifique-se de que o IIS não esteja configurado para usar um Web Garden. Para fazer isso:
    1. Abra o gerenciador IIS.
    2. Determine qual pool de aplicativos seu aplicativo da web está usando.
    3. Clique com o botão direito no pool de aplicativos e selecione "Propriedades Avançadas".
    4. Role para baixo e defina "Máximo de processos de trabalho" para 1.

Configurações do pool de aplicativos

Solução 2:

Confira este blog do MSDN:Gerenciamento de estado de sessão em processo

Ele descreve as opções de estado da sessão e como solucionar problemas de perda de sessão do InProc.

Responder2

Faz muito tempo que não mudo o código. (última alteração: 20 de julho de 2016)

Mas também tenho o mesmo problema no Windows Server 2016. Meu cliente estava atualizando o Windows 2012 R2 para o Windows 2016. Não consegui resolver esse problema.

Então faço o downgrade para o servidor antigo (windows 2012 r2). Meu problema foi resolvido. Acho que é um bug, mas não tenho certeza

Talvez isso te ajude.

informação relacionada