Compreendendo o estado da sessão asp.net
Autor:Eve Cole
Data da Última Atualização:2009-07-01 16:44:49
1. Funções do estado da sessão
HTTP é um protocolo sem estado, portanto, não indica automaticamente se uma sequência de solicitações vem todas do mesmo cliente ou mesmo se uma única instância do navegador ainda está visualizando ativamente uma página ou site. E usando a função de estado de sessão integrada do ASP.net, podemos usar
1. Identifique e classifique automaticamente solicitações de um único cliente de navegador para uma sessão lógica de aplicativo no servidor.
2. Armazene dados com escopo de sessão no servidor para uso em diversas solicitações do navegador.
3. Gere eventos apropriados de gerenciamento de vida útil da sessão (Session_OnStart, Session_OnEnd, etc.) que podem ser manipulados no código do aplicativo
2. Identificação do status da sessão
Ao criar uma sessão, o servidor gera um ID separado para cada sessão. O identificador é representado por uma sequência SessionID de 120 bits que contém apenas os caracteres ASCII permitidos na URL. O valor SessionID é gerado usando um algoritmo que garante exclusividade e aleatoriedade. O objetivo de garantir a exclusividade é garantir que as sessões não entrem em conflito, e o objetivo de garantir a aleatoriedade é garantir que usuários mal-intencionados não possam usar novos SessionIDs para calcular o número de SessionIDs existentes. sessões.
3. Como armazenar o estado da sessão
Existem três maneiras de armazenar o estado da sessão:
1. Modo de estado de sessão em processo (Inproc): Quando criamos um novo programa da Web, o modo de estado de sessão em processo é adotado por padrão. Este também é o modo comumente usado por todos. Nesse modo, o estado da sessão é armazenado localmente no processo de trabalho do ASP.NET, portanto, de longe, o modo de estado da sessão em processo é provavelmente a opção de acesso mais rápida. Porém, quanto mais dados armazenados em uma sessão, mais memória o servidor web consome, aumentando potencialmente o risco de degradação do desempenho.
2. Modo de servidor de estado .NET (StateServer): O estado da sessão é armazenado no processo remoto (por exemplo, no serviço do Windows NT denominado aspnet_state.exe)
3. Modo SQL (SQLServer): O estado da sessão é armazenado em uma tabela de banco de dados dedicada gerenciada pelo SQL Server.
Tanto o modo de servidor de estado .NET quanto o modo SQL podem ser chamados de modo de sessão fora de processo. Ao armazenar dados, os dados precisam ser serializados e armazenados em um repositório externo. ao dicionário de sessão local, portanto a solicitação resultou em degradação de desempenho de 15% (fora do processo) a 25% (SQL Server). Observe que esta é apenas uma estimativa aproximada. Mas no cenário de armazenamento fora do processo, o estado da sessão sobrevive por mais tempo, tornando o aplicativo mais poderoso porque protege contra falhas do Microsoft® Internet Information Services (IIS) e do ASP.NET. Ao separar o estado da sessão dos aplicativos, você também pode estender mais facilmente os aplicativos existentes para arquiteturas Web Farm e Web Garden. Além disso, o estado da sessão é armazenado em um processo externo, eliminando essencialmente o risco de perda periódica de dados devido a loops de processo.
4. Configuração do estado da sessão
A configuração do estado da sessão é obtida definindo a seção do arquivo Web.config. A seguir são apresentados os métodos de configuração específicos dos três estados de sessão.
1. Modo em processo
O modo em processo é o modo de estado de sessão padrão. Para usar o modo em processo, configure o atributo mode do elemento como Inproc.
Um exemplo de configuração para o modo em processo é mostrado abaixo. http://www.downcodes.com
<configuração>
<modo sessionState="Inproc"
sem cookies = "falso"
tempo limite="20"/>
</sessionState>
</system.web>
</configuração>
2. Modo servidor de estado
Para usar um servidor de estado, primeiro você deve garantir que o serviço de estado ASP.NET esteja em execução no servidor remoto usado para armazenamento de sessão. Este serviço é instalado com ASP.NET e Visual Studio .NET em:
raiz do sistemaMicrosoft.NETFrameworkversionNumberaspnet_state.exe
Em seguida, no arquivo Web.config do aplicativo, defina o atributo mode do elemento como StateServer. Por fim, defina a propriedade connectionString como tcpip=serverName:portNumber.
A seguir está um exemplo de definições de configuração para o modo de servidor de estado.
<configuração>
<sessionState mode="StateServer"
stateConnectionString = "tcpip = servidor de dados: 42424"
sem cookies = "falso"
tempo limite = "20"/>
</sessionState>
</system.web>
3. Modo SQL Server
Para usar o SQL Server, primeiro execute InstallSqlState.sql ou InstallPersistSqlState.sql no computador SQL Server onde o estado da sessão será armazenado. Ambos os scripts criam um banco de dados denominado ASPState, que contém vários procedimentos armazenados.
A diferença entre os dois scripts é onde as tabelas ASPStateTempApplications e ASPStateTempSessions são colocadas. O script InstallSqlState.sql adiciona essas tabelas ao banco de dados TempDB, que perderá dados quando o computador for reiniciado. Em vez disso, o script InstallPersistSqlState.sql adiciona essas tabelas ao banco de dados ASPState, o que permite que os dados da sessão sejam preservados durante as reinicializações do computador.
Por padrão, ambos os arquivos de script são instalados no seguinte local:
raiz do sistemaMicrosoft.NETFrameworkversionNumber
Em seguida, no arquivo Web.config do aplicativo, defina o atributo mode do elemento como SQLServer. Por fim, configure a propriedade sqlConnectionString como Integrated Security=SSPI;data source=serverName;.
Um exemplo de configuração para o modo SQL Server é mostrado abaixo.
<configuração>
<modo sessionState="SQLServer"
sqlConnectionString="Segurança Integrada=SSPI;fonte de dados=servidor de dados;"
sem cookies = "falso"
tempo limite="20"/>
</sessionState>
</system.web>
</configuração>
No modo SQL Server, o estado da sessão também pode ser configurado para funcionar em um cluster de failover. Um cluster de failover consiste em dois ou mais servidores Web redundantes idênticos que armazenam dados de sessão em um banco de dados SQL Server em um computador separado. Se um servidor Web falhar, outro servidor no cluster assumirá seu trabalho e atenderá as solicitações sem perder os dados da sessão.
Para configurar o cluster de failover, defina o elemento no arquivo Web.config do servidor Web com o mesmo valor.
Em seguida, defina a cadeia de conexão SQL do servidor Web para apontar para o banco de dados SQL Server no computador onde os dados da sessão estão armazenados.
5. Acesso ao estado da sessão
Você pode acessar o estado da sessão diretamente por meio da coleção Session. Para compatibilidade com versões anteriores do ASP, o acesso ao estado da sessão também pode ser obtido através da propriedade Session.Contents no objeto do aplicativo.
O exemplo a seguir mostra a gravação de dois valores na coleção Session na primeira página da web e a leitura da coleção Session na segunda página da web. Nota: Os códigos das páginas são omitidos aqui.
A primeira página da web grava o valor na coleção Session
dim nome como string = "a"
dim id como inteiro = "1"
sessão("nome") = nome
sessão("id") = id
A segunda página da web obtém o valor da coleção Session
dim nome como string = session("nome")
dim id como inteiro = sessão("id")
'Obtém o número de itens na coleção de estado da sessão
dim i como inteiro = session.count
Observe que no modo em processo, nenhuma serialização e desserialização reais ocorrem, portanto os objetos são armazenados no estado de sessão como instâncias ativas de suas respectivas classes.
No modo de sessão fora de processo, como são utilizadas serialização e desserialização, é necessário converter o tipo de dados de acordo com a situação.
Se você estiver serializando um valor de data, a data deverá ser do tipo Int64.
6. Eventos de gerenciamento de duração da sessão
Existem dois eventos de gerenciamento de vida útil da sessão, evento Session_OnStart e evento Session_OnEnd. Você pode defini-los no arquivo Global.asax.VB.
1. Evento Session_OnStart
Quando um único cliente do navegador se conecta ao servidor, o evento Session_OnStart é acionado, que marca o início da sessão. Este evento não será mais acionado durante a navegação subsequente, a menos que a sessão expire ou seja abandonada. O evento Session_OnStart é o melhor momento para definir variáveis de sessão porque elas são definidas antes de qualquer página ser acessada.
Exemplo: O exemplo a seguir é um código de evento Session_OnStart comumente usado para contar o número de pessoas online:
Sub Session_Start(ByVal remetente As Object, ByVal e As EventArgs)
'Quando ocorrer um evento, adicione 1 ao número de usuários online
Aplicativo("contador de usuários") = Aplicativo("contador de usuários") + 1
Finalizar sub
2. Evento Session_OnEnd
O evento Session_OnEnd ocorre quando uma sessão é abandonada ou expira e marca o fim do evento. Mas observe que este evento só é compatível com o modo InProc. Você pode especificar o período de tempo limite por meio do atributo timeout da seção do arquivo Web.config. Se o usuário estiver dentro do período de tempo limite (em minutos, o padrão é 20 minutos).
clock) sem atualizar ou solicitar a página web, a sessão será encerrada. Você pode usar o evento Session_OnEnd para fazer algum trabalho de limpeza.
Exemplo: O exemplo a seguir é um código de evento Session_OnEnd comumente usado para contar o número de pessoas online:
Sub Session_End(ByVal remetente As Object, ByVal e As EventArgs)
Aplicativo("contador de usuários") = Aplicativo("contador de usuários") - 1
Finalizar sub