Acabei de descobrir que cada solicitação em um aplicativo Web ASP.Net obtém um bloqueio de sessão no início de uma solicitação e a libera no final da solicitação!
Caso as implicações disso sejam perdidas para você, como era para mim a princípio, isso basicamente significa o seguinte:
Sempre que uma página da Web ASP.Net está demorando muito para ser carregada (talvez devido a uma chamada lenta do banco de dados ou qualquer outra coisa), e o usuário decide que deseja navegar para uma página diferente porque está cansado de esperar, ELES NÃO PODEM! O bloqueio de sessão do ASP.Net força a nova solicitação de página a aguardar até que a solicitação original termine sua carga lenta e dolorosa. Arrrgh.
Sempre que um UpdatePanel estiver carregando lentamente, e o usuário decidir navegar para uma página diferente antes que o UpdatePanel termine de atualizar ... ELES NÃO PODEM! O bloqueio de sessão do ASP.net força a nova solicitação de página a aguardar até que a solicitação original termine sua carga lenta e dolorosa. Arrrgh dobro!
Então, quais são as opções? Até agora eu vim com:
- Implemente um SessionStateDataStore personalizado, suportado pelo ASP.Net. Eu não encontrei muitos por aí para copiar, e parece meio alto risco e fácil de estragar.
- Acompanhe todas as solicitações em andamento e, se uma solicitação vier do mesmo usuário, cancele a solicitação original. Parece meio extremo, mas funcionaria (eu acho).
- Não use Session! Quando eu precisar de algum tipo de estado para o usuário, eu poderia apenas usar o Cache e itens-chave no nome de usuário autenticado, ou algo assim. Mais uma vez parece meio extremo.
Eu realmente não posso acreditar que a equipe da ASP.Net Microsoft teria deixado um gargalo de desempenho tão grande na estrutura na versão 4.0! Estou perdendo algo óbvio? Quão difícil seria usar uma coleção ThreadSafe para a sessão?