Dados de sessão do ASP.NET incorretos retornados intermitentemente

2

Recebi a tarefa de analisar 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 parece um problema de configuração de cluster de balanceamento de carga / web. No entanto, descobri mais tarde que o site não tem balanceamento de carga - é um servidor único.

O aplicativo tem um objeto Basket que é armazenado em Session. O usuário adiciona itens à cesta, etc. Quando 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 é perdida, ela volta quase sempre na próxima atualização, mas a cesta pode ficar vazia ou ter conteúdo diferente na próxima atualização. Eu já vi esse comportamento antes 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 podemos replicar o problema, mas ao vivo acontece muito.

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

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

Eu usei o violinista para examinar as solicitações e as respostas, e o ID da sessão do ASP.NET transmitido ao servidor é o mesmo a cada vez. 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:

Eu 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 antes de postar isso.

Estou convencido de que este é um problema do servidor, o código funciona como esperado no nosso ambiente de testes.

    
por James 16.05.2014 / 17:12

2 respostas

0

"I said that it seems like a load-balancing/web cluster configuration issue. However, I found out later that the website is not load-balanced - It's a single server."

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

É como um pequeno "Web Farm" - daí o nome "Web Garden". :)

Um efeito ao usar um Web Garden é que ele faz com que as variáveis da 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 (em processo) só funciona de forma confiável se você sempre termina no 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 do IIS.
    2. Determine qual pool de aplicativos você está usando no aplicativo da web.
    3. Clique com o botão direito no seu Pool de aplicativos e selecione " Propriedades avançadas ".
    4. Role para baixo e defina " Máximo de processos de trabalho " para 1 .

Solução2:

  • Useumservidordeestadodesessãocujaúnicatarefaégerenciarestadosdesessãoparatodososprocessosdetrabalho.
  • Emseguida,altereoaplicativodaWebdeInProcparaStateServer.
  • Confira Configure um servidor de estado para manter o estado da sessão (IIS 7) para começar isso. :)

Confira este blog do MSDN: In -Gestão do Estado da Sessão do Contrato

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

    
por 16.05.2014 / 17:31
-1

Eu não mudei o código por muito tempo (última alteração: 20 de julho de 2016)

Mas tenho o mesmo problema no Windows Server 2016. Meu cliente atualizou o Windows 2012 R2 para o Windows 2016. Não consegui resolver esse problema.

Em seguida, faço o downgrade para o servidor antigo (windows 2012 r2). Meu problema foi resolvido. Eu acho que é um bug, mas eu não posso ter certeza

Talvez isso ajude você.

    
por 08.03.2017 / 00:00