Problema no estado da sessão do ASP.NET do servidor Web IIS 7.5 com balanceamento de carga

14

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:

  1. Nossa configuração é 2 x WebServers com balanceamento de carga + banco de dados de estado de sessão única.
  2. 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.
  3. 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).
  4. 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:

  1. Á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.
  2. Altere o ID para algo único, por exemplo, 10. Clique em OK.
  3. 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\W3SVC10por 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.

James McCormack
fonte

Respostas:

11

A julgar pela sua pergunta, parece que você tem um servidor de estado da sessão central (DB?) Que controla os dados da sessão?

Você também deve sincronizar a chave da máquina que é usada para criptografia para que qualquer autenticação de formulários, etc. funcione. Isso também pode afetar a identificação da sessão, não tenho certeza.

Configurando chaves de máquina no IIS 7

Além disso, você deve usar a configuração compartilhada entre as máquinas, pois ela mesma pode corrigir o problema com chaves de máquina diferentes.

Sincronização de configuração do IIS para farm de servidores Web?

EDIT: Quando você alterou o ID do site, tentou reiniciar o gerenciador do IIS para verificar se a raiz da web havia sido alterada? Talvez a configuração esteja conectada ao ID, o que significa que uma alteração no ID também modifica coisas como a raiz do documento, etc.

jishi
fonte
Obrigado pelas idéias Jishi, mas eu já havia sincronizado o machineKey no web.configs. Acho que estou realmente procurando uma maneira de alterar o ID da Instância do IIS de um site sem precisar remover e reconfigurar completamente os sites nos servidores web.
James McCormack
Quando você alterou o ID do site, tentou reiniciar o gerenciador do IIS para verificar se a raiz da web havia sido alterada? Talvez a configuração está ligado ao significado ID que uma mudança na ID também modifica coisas como a raiz do documento etc.
jishi
1
Sim, foi isso! Esqueci de reiniciar o serviço IIS (linha de comando iisreset / restart). Funcionou bem depois disso! Atualize sua resposta com essas informações e eu darei a resposta aceita.
James McCormack
Negócio feito. Que bom que funcionou para você.
11111