Pergunta

1º post sobre stackoverflow, espero ter grande gabarito:)

Atualmente estou tentando carregar equilibrar o nosso web site. Criámos a 2 cluster NLB no servidor Windows 2003 com o IIS 6.

Ao testar a configuração, descobri que, por vezes, a nossa sessão é perdida. Um dia e meio depois, aqui está o resultado:

  1. Sim, o nosso machine.config ambos têm a mesma chave de encriptação / desencriptação.
  2. Sim, a id no IIS metabase.xml são as mesmas para ambos máquina. Na verdade, o arquivo inteiro são os mesmos, exceto para "AdminACL".
  3. Ambos aplicação web são definidos com "StateServer" e ambos apontando para a mesma máquina.

A partir desse ponto, pesquisando no Google dá menos informações e possíveis soluções.

Pelo que eu sei, não há nenhum padrão particular que causa este problema. Ele só acontecem de vez em quando.

Ao tentar encontrar o problema, eu vi que um pedido enviado o cookie identificação de sessão ASP para o servidor, mas o servidor não mapeá-lo para a sessão do usuário.

Assim, o número de solicitação x foi enviado para o cliente, com o cookie, a sessão foi mapeado, e tudo correu bem. O número de solicitação x + 1 foi enviado para o cliente, com o cookie, mas sessão não foi encontrado.

Tanto o pedido foram feitas na mesma máquina na NLB.

Aqui está um trecho do trace.axd asp:

1ª pedido:

Detalhes da solicitação Session ID: j2ffvy45updpc52uhw1mbg55 Pedido Tipo: GET Tempo de Solicitação: 2008/11/26 14:58:06 Estado Código: 200 Pedido de Codificação: Unicode (UTF-8) Response Codificação: Unicode (UTF-8)

Request cookies Collection

Nome do valor Tamanho

ASP.NET_SessionId j2ffvy45updpc52uhw1mbg55 42 AID 22 9

Response cookies Collection

Nome do valor Tamanho

Headers Collection

Nome do valor

Cookie ASP.NET_SessionId = j2ffvy45updpc52uhw1mbg55; AID = 22

2ª Pedido:

Detalhes da solicitação Sessão Id: Tipo de Solicitação: POST Tempo de Solicitação: 2008/11/26 14:58:08 Estado cupom:
Pedido de Codificação: Unicode (UTF-8) Response Encoding:

Request cookies Collection

Nome do valor Tamanho

Response cookies Collection

Nome do valor Tamanho

Coleção cabeçalhos nome do valor Bolacha ASP.NET_SessionId = j2ffvy45updpc52uhw1mbg55; AID = 22

Como você pode ver no 2º pedido, o cookie é enviado a partir do cliente, mas asp parece nunca adicione os cookies no que é "Request coleção dos biscoitos". Eu acho que é por isso que ele não encontrar a sessão.

Então, por que o cookie não é mapeado para a sessão? É esse o problema? É o problema em outro lugar?

Sinta-se livre para perguntar quaisquer esclarecimentos.

Obrigado a todos por seu feedback.

JF

Foi útil?

Solução

Eu finalmente encontrei a resposta para o meu problema. origem, de estão dentro do código do aplicativo (como 99% da 3ª ferramentas de parte de um programador 'erros'). Eu decidi postá-lo de qualquer maneira no caso de alguém está em um cenário semelhante.

Este código era parte da classe WebServiceRequester. A classe solicitante do serviço web foi instanciado quando a sessão foi criado e ele é salvo na sessão. Durante a criação, nós initalizate dos Estados m_webServiceURL ', e esse membro é salvo na sessão depois. Em que o valor foi esta initialize membro foi em função de um ajuste na máquina local.

A parte importante é o seguinte: classe WebServiceRequester contém um WebService objetos. WebService objectos não podem ser salvos em sessão, eles não são serializado em asp. A propriedade tinha o atributo [NonSerialized] nele. Então toda vez que acessamos a propriedade 'WebService' do objeto para a primeira durante um ciclo de vida da página, tivemos que criar um novo, e atribuindo ot-lo a url 'm_webServiceURL', que foi salvo na sessão. Então você vê, novo webservice objeto, em possivelmente uma máquina diferente, ou seja, uma configuração diferente em cada máquina.

então aqui está o que aconteceu: caixa de 29 foi definido para acesso Web Service no localhost

caixa de 30 foi definido para acesso à Web Serviço como 192.168.253.29.

Tecnicamente, eles estão definidos na mesma máquina. Mas aqui está um cenário:

login na caixa 29. m_webServiceURL está definido como localhost em sessão.

[algum pedido na caixa 29 aqui]

NLB balanceamento nos trazer na caixa 30. Box 30 carrega da sessão, crie um novo obect webservice com localhost como o endereço do serviço web. caixa de 30 fez o pedido para o serviço Web errada levando a uma exceção Expirado sessão.

Um dos problemas durante a depuração, foi que a comunicação local não foram registrados com o monitor de rede.

O que me levar no traçado, foi que nunca teve uma exceção registrado no traçado log caixa de 29, como deveria ter.

Obrigado por você sugestões todos, foi muito apreciado.

Tenha um bom dia. JF

Outras dicas

Não estritamente uma resposta à sua pergunta, mas você já tentou fazê-lo usando um armazenamento de sessão baseada sql server? (Procurar no MSDN para o script permanente, em vez do script temporário que é fornecido com asp.net)

Já ouvi falar "coisas ruins" sobre o serviço sessão executável e, consequentemente, não tê-lo usado. Nunca tive qualquer problema agricultura com a solução baseada em servidor sql embora web.

Infelizmente não é estritamente uma resposta para o seu problema, mas deve (a) reparo ele, ou (b) reduzi-lo significativamente.

Bem, se você estiver usando o Visual Studio, você poderia pelo menos testá-lo com o MSDE (o corte para baixo versão do SQL Server que vem com o Visual Studio) ...

Pode ajudar a excluir problemas do servidor de estado ...

Usando a abordagem de banco de dados tem seus próprios problemas. Eu acho que você deve ser capaz de usar a sua abordagem preferida.

este artigo solução de problemas sessão ajudaria?

Ou " Solução de problemas Sessão Problemas Relacionados ASP.NET "

Ou " Solução de problemas Expired Estado de sessão ASP.NET e suas opções "

Eu vou ser coxo e reiterar a proposta do MS SQL Server. Instalar o SQL Server Express que é completeley gratuito, incluindo para uso comercial e tem apenas estes 3 inconvenientes que não deve ser um problema para você nesta fase:

  • banco de dados de tamanho Max 4GB
  • Max 1 Core CPU usado
  • Max 1GB RAM usado

Alguns pontos a ter em consideração:

  • O que é a carga em seu site? Estado Server tem a tendência a falhar quando diante de um grande número de acessos simultâneos. Estamos apenas a usá-lo em cenários onde temos realmente um pequeno número de usuários (nos anos 10, os sistemas de back-end em sua maioria). Sempre que tentei usá-lo em produção para locais que servem 1000 de usuários diários, que deixaria de funcionar levando à perda de dados de sessão.
  • Em um dos ambientes de produção que administramos, estamos usando MSSQL 2005 Express para gerenciar as sessões, o site tem 10K + usuários por dia e 200K + páginas por dia. Esta é uma abordagem recomendada em sessão caso é uma obrigação e fortemente acoplados em sua aplicação.

Se você está prestes a usuário MSSQL Express como seu estado DB, lembre-se que ele não vem com o SQL Server Agent que significa que há nenhuma tarefa agendador execução em segundo plano e limpeza suas sessões expiradas. Eu recomendo encontrar um programador e executar as sessões expiradas limpas procedimento armazenado periodicamente.

Boa sorte

Em vez de andar com SQL, envie seus testes diretamente em um de seus IIS nós para ver se você ainda obter o mesmo problema. Tenho certeza de que se o seu único fazendo um pequeno número de testes StateServer não vai ser o problema.

Tente configurar o nome de domínio do ASP.NET_SessionId através de código para ".yourdomain.com". Por padrão, o nome de domínio de cookie ASP.NET_SessionId está definido para o caminho do aplicativo completo. Então, isso pode ser uma das razões por que o cookie não está viajando.

por exemplo. Request.Cookies [ "ASP.NET_SessionId"]. Domínio = ".yourdomain.com". Lembre-se o primeiro "" é importante para o nome de domínio.

Você pode fazer isso no HttpModule no evento AcquireRequestState.

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