Páginas

quarta-feira, 23 de março de 2011

Session.SessionID é alterado a cada request

Em meu estudos com o ASP.NET MVC 3 me deparei com um problema relacionado ao objeto Session do ASP.NET.

Na teoria, a propriedade SessionID deste objeto deveria ter o mesmo valor para a sessão. Mas não é o que estava acontecendo com os meus testes no ASP.NET MVC 3.

Todo request que eu fazia em uma View o SessionID era diferente.

Depois de algumas buscas na internet encontrei uma solução.
Para resolver este problema tive que implementar o método Session_Start no Global.asax, para que ele não execute o Session_Start da classe base do ASP.NET e mantenha o mesmo SessionID para cada sessão.
public void Session_Start(object sender, EventArgs e)
{
}

Estamos acostumados a utilizar o Microsoft Visual Studio para gerar um projeto ASP.NET e esquecemos de algumas coisas que ele faz automaticamente para nós, como a criação do Global.asax e a implementação dos métodos Application_Start, Session_Start, Application_BeginRequest, Application_AuthenticateRequest, Application_EndRequest, Application_Error, Session_End e Application_End, no qual ao criar um projeto ASP.NET MVC 3.0 ele somente cria o método Application_Start para registrar o MVC 3.0.

5 comentários:

  1. Sr. Seninha,

    Só faltou falar o porque que isso acontece, vamos lá.

    Se utilizar o estado de sessão baseado no Cookie (que é o mais utilizado), o ASP.NET não alocará uma espaço de memória até que a mesma seja utilizada, ou seja, enquanto você não armazenar nada na sessão o SessionID vai mudar, a não ser que você altere o Global.asax como você demonstra no post.

    Isso só vai ser necessário se você precisar de um SessionID estatico para a sua aplicação.

    Abraços

    ResponderExcluir
  2. Olá,

    Eu tenho uma aplicação feita em ASP.net, e depois que mudei para o IIS7 o Session.SessionID muda a cada página. Isso não acontecia nas versões anterios do IIS.
    Existe algo que eu possa fazer para funcionar também no IIS. No meu caso, eu preciso que o Session.SessionID seja mantido.

    Grato.

    Roni.

    ResponderExcluir
  3. Caro Roni,

    Existe um item novo no Application Pool do IIS7, que tem o nome de "Managed pipeline mode", nele você tem duas opções, Integrated e Classic.

    O Classic irá rodar a aplicação web com o mesmo contexto da versão do IIS6, ou seja, irá utilizar o "Aspnet_isapi.dll" e não a versão nova que é rodada ao utilizar a opção Integrated.

    Tente alterar este pipeline do application pool de sua aplicação para "Classic" e veja se funciona.

    ResponderExcluir
  4. Caro João,

    Infelizmente esta opção já está configurada.

    Existe algo mais para se fazer?

    Grato.

    Roni.

    ResponderExcluir
  5. Roni,
    Vamos tentar com a opção "Integrated" do Application Pool e verifique se no seu web.config existe a tag system.webServer (conforme exemplo abaixo), que é utilizada pelo IIS 7.

    <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true"/>
    </system.webServer>

    ResponderExcluir