Compartilhar via


Provedor de armazenamento de estado de sessão Exemplo

Descreve uma implementação personalizada de provedor de armazenamento de estado de sessão que utiliza o provedor de dados do .NET Framework ODBC para gerenciar informações de sessão em um banco de dados Access.

Os tópicos a seguir incluem o código para uma implementação de Provedor de armazenamento de estado de sessão Exemplo.O provedor exemplo usa as classes System.Data.Odbc para armazenar e recuperar informações de sessão, usando um banco de dados Access.

Este tópico descreve detalhes da implementação sobre o provedor de armazenamento de estado de sessão exemplo e descreve como criar o exemplo e configurar um aplicativo ASP.NET para usar o Provedor de exemplo.

O código para o provedor exemplo pode ser encontrado no tópico Como: Provedor de armazenamento de estado de sessão Exemplo.

Esquema de banco de dados

O provedor de estado de sessão exemplo usa uma única tabela denominada sessões para gerenciar informações de sessão.Para criar a tabela do Access usada pelo provedor exemplo, emita esta consulta de definição de dados em um banco de dados Access novo ou existente.

CREATE TABLE Sessions
(
  SessionId       Text(80)  NOT NULL,
  ApplicationName Text(255) NOT NULL,
  Created         DateTime  NOT NULL,
  Expires         DateTime  NOT NULL,
  LockDate        DateTime  NOT NULL,
  LockId          Integer   NOT NULL,
  Timeout         Integer   NOT NULL,
  Locked          YesNo     NOT NULL,
  SessionItems    Memo,
  Flags           Integer   NOT NULL,
    CONSTRAINT PKSessions PRIMARY KEY (SessionId, ApplicationName)
)

Acesso a Log de eventos

Se o provedor exemplo encontrar uma exceção ao trabalhar com a fonte de dados, ele grava os detalhes de exceção para o log de eventos do aplicativo ao invés de retornar a exceção para o aplicativo ASP.NET.Isso é feito como uma medida de segurança para impedir que informações particulares sobre a fonte de dados sejam expostas no aplicativo ASP.NET.

O provedor exemplo especifica um valor da propriedade Source do evento de "OdbcSessionStateStore". Antes de seu aplicativo ASP.NET ser capaz de gravar para o log de eventos do aplicativo com êxito, será necessário criar a chave do Registro a seguir:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\OdbcSessionStateStore

Se você não desejar que o provedor de exemplo grave as exceções no log de eventos, em seguida, você pode definir o atributo personalizado writeExceptionsToEventLog para false no arquivo Web.config.

Suporte para o evento Session_OnEnd

O provedor de armazenamento de estado de sessão exemplo não oferece suporte ao evento Session_OnEnd definido no arquivo Global.asax, já que não há forma de o banco de dados Access notificar o provedor de armazenamento de estado de sessão que já passaram a data e a hora de expiração para uma sessão.O provedor de armazenamento de estado de sessão deve consultar para obter esta informação.Você não pode prever quando o provedor de armazenamento de estado de sessão será usado, e, portanto, é improvável que o evento Session_OnEnd será gerado no momento exato em que a sessão expirar.Como resultado, a implementação do método SetItemExpireCallback no exemplo de provedor de armazenamento de estado da sessão retorna false, para informar o SessionStateModule que o evento Session_OnEnd não é suportado.

Limpando dados de sessão expirados

Como o provedor de armazenamento de estado de sessão exemplo não fornece suporte para o evento Session_OnEnd, ele faz automaticamente a limpeza dos dados de item de sessão expirados.É recomendável que você periodicamente exclua informações de sessão expiradas do armazenamento de dados com o código a seguir.

Dim commandString As String = "DELETE FROM Sessions WHERE Expires < ?"
Dim conn As OdbcConnection = new OdbcConnection(connectionString)
Dim cmd As OdbcCommand = New OdbcCommand(commandString, conn)
cmd.Parameters.Add("@Expires", OdbcType.DateTime).Value = DateTime.Now
conn.Open()
cmd.ExecuteNonQuery()
conn.Close()
string commandString = "DELETE FROM Sessions WHERE Expires < ?";
OdbcConnection conn = new OdbcConnection(connectionString);
OdbcCommand cmd = new OdbcCommand(commandString, conn);
cmd.Parameters.Add("@Expires", OdbcType.DateTime).Value = DateTime.Now;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();

Criando o provedor exemplo

Para usar o Provedor exemplo, você pode colocar seu código-fonte no Diretório App_Code do seu aplicativo.Observe que se você já tiver código-fonte no Diretório App_Code do seu aplicativo, você deve adicionar a versão do provedor de exemplo que está escrita na mesmo linguagem que o código existente no Diretório.O provedor será compilado pelo ASP.NET quando seu aplicativo for solicitado.

Você pode também compilar o provedor de exemplo como uma biblioteca e colocá-lo no Diretório Bin do seu aplicativo da Web, ou fortemente denomine-o e coloque-o no GAC.O comando a seguir mostra como compilar o provedor exemplo usando o compilador de linha de comando após o código de exemplo ter sido copiado para um arquivo denominado OdbcSessionStateStore.vb para Visual Basic e OdbcSessionStateStore.cs para C#.

vbc /out:OdbcSessionStateStore.dll /t:library OdbcSessionStateStore.vb /r:System.Web.dll /r:System.Configuration.dll
csc /out:OdbcSessionStateStore.dll /t:library OdbcSessionStateStore.cs /r:System.Web.dll /r:System.Configuration.dll

Usando o provedor exemplo em um aplicativo ASP.NET

O exemplo a seguir mostra o arquivo Web.config para um aplicativo ASP.NET configurado para usar o Provedor exemplo.O exemplo usa um DSN ODBC nomeado &quot; SessionState &quot; para obter informações de conexão para o banco de dados Access.Para usar o Provedor exemplo, será necessário criar o DSN do sistema &quot;SessionState &quot; ou fornecer uma sequência de conexão ODBC válida com seu banco de dados.

A configuração exemplo supõe que seu site da Web esteja configurado para usar autenticação de formulários Backup e inclui uma página ASP.NET chamada Login.aspx que permite que os usuários efetuem logon.

<configuration>
  <connectionStrings>
    <add name="OdbcSessionServices" connectionString="DSN=SessionState;" />
  </connectionStrings>

  <system.web>
    <sessionState 
      cookieless="true"
      regenerateExpiredSessionId="true"
      mode="Custom"
      customProvider="OdbcSessionProvider">
      <providers>
        <add name="OdbcSessionProvider"
          type="Samples.AspNet.Session.OdbcSessionStateStore"
          connectionStringName="OdbcSessionServices"
          writeExceptionsToEventLog="false" />
      </providers>
    </sessionState>
  </system.web>
</configuration>

Consulte também

Conceitos

Implementar um Provedor de Armazenamento de Estado da Sessão

Visão geral sobre Estado de sessão ASP.NET

Visão Geral sobre o Gerenciamento de Estado do ASP.NET