temos um problema com um site ASP.NET em que as sessões dos usuários estão se comportando de maneira estranha - os dados da sessão aparecem, desaparecem e reaparecem.
Eu acho que sei qual é o problema:
- Nossa configuração é 2 x WebServers com balanceamento de carga + banco de dados de estado de sessão única.
- O armazenamento do estado da sessão do ASP.NET SQL parece depender da ID da instância do site do IIS (ID da metabase) para identificar exclusivamente a ID do cookie de sessão recebida e recuperar / armazenar valores.
- O ID da instância do site IIS do site é diferente em cada servidor ativo (ID / W3SVC / 1 / Root no servidor da Web A, ID / W3SVC / 2 / Root no servidor da Web B).
- O balanceamento de carga não está usando afinidade do cliente, portanto, cada solicitação HTTP do usuário pode ir para qualquer servidor.
Portanto, à medida que um usuário faz logon no site e se move, cada chamada HTTP pode ir para um servidor Web e, portanto, usar um registro de Estado da Sessão com IDs diferentes, dependendo do servidor. Com efeito, o usuário teria simultaneamente 2 instâncias de sessão separadas. Acredito que verifiquei isso como na tabela ASPStateTempSessions do banco de dados , cada ID de cookie de sessão parece corresponder a 2 registros quase idênticos (seus IDs diferem apenas nos últimos caracteres, que acredito serem um modificador baseado no AppID do Tabela AspStateTempApplications ) criada em segundos um do outro.
Portanto, o estado da sessão parecerá se comportar mal, pois as alterações feitas em um registro de sessão persistirão apenas nesse servidor da web. Se o usuário mudar para outro servidor com balanceamento de carga, os valores da sessão parecerão desaparecer ou reverter.
Acredito que a solução é sincronizar os IDs da instância do IIS dos sites (por exemplo, torná-los ambos / W3SVC / 1 / Root ), mas tentei editar esse valor no IIS em Configurações avançadas e, embora ele tenha salvo OK, apenas fez o o site retorna 404s nesse servidor até que eu o altere novamente.
Eu encontrei um script VBS para este problema, mas ele parece ser para IIS 6 apenas por isso estou preocupado em tentar isso. Alguém mais encontrou essa situação no IIS 7.5 e como você a corrigiu?
EDIT / SOLUÇÃO
Meu erro foi que eu esqueci de reiniciar o IIS depois que alterei o ID da instância do site no IIS. Depois disso, o ID foi atualizado e as sessões do ASP.NET foram sincronizadas nos dois servidores web.
Instruções completas:
- Área de trabalho remota no servidor LIVE1, abra o IIS Mgr, clique no site com problema e escolha Configurações avançadas na barra lateral.
- Altere o ID para algo único, por exemplo, 10. Clique em OK.
- Reinicie o serviço web (
c:\windows\system32\iisreset /restart
)
Faça o mesmo para o LIVE2 (verifique se o ID do site é o mesmo que no LIVE1)
Observe que o ID do site afeta o local dos arquivos do site, por exemplo, a pasta do arquivo de log se tornaria, C:\inetpub\logs\LogFiles\W3SVC10
por exemplo.
Note também que você poderia fazer essas alterações manualmente editando o site id atributo no arquivo de configuração em cada servidor IIS: C:\Windows\System32\inetsrv\config\applicationHost.config
. Requer privilégios de administrador e ainda precisa ser redefinido posteriormente.