Поделиться через


Пример поставщика хранилища состояния сеанса

Обновлен: Ноябрь 2007

Описаны пользовательские реализации поставщика хранилища состояния сеанса, который использует поставщик данных ODBC .NET Framework для управления сведениями сеанса в базе данных Access.

Следующие разделы включают код для примера реализации поставщика хранилища состояния сеанса. В поставщике данного примера использованы классы System.Data.Odbc, чтобы хранить и извлекать сведения о сеансе с помощью базы данных Access.

В этом разделе описаны сведения реализации примера поставщика хранилища состояния сеанса и описано, как выполнить построение примера и настройку приложения ASP.NET на использование поставщика данного примера.

Код для поставщика из данного примера см. в разделе Практическое руководство. Пример реализации поставщика хранилища состояния сеанса.

Схема базы данных

В примере поставщика состояния сеанса использована одна таблица с именем Sessions для управления сведениями о сеансах. Чтобы создать таблицу Access, которая будет использоваться поставщиком из данного примера, выполните следующий запрос определения данных в новой или существующем базе данных Access:

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)
)

Доступ к журналу событий

Если поставщик из данного примера сталкивается с исключением при работе с источником данных, данные исключения записываются в журнал событий приложения вместо возвращения исключения приложению ASP.NET. Это сделано в качестве меры безопасности, чтобы избежать раскрытия закрытых сведений об источнике данных в приложении ASP.NET.

В поставщике данного примера для свойства события Source указано значение "OdbcSessionStateStore". Прежде чем приложение ASP.NET сможет успешно выполнять запись в журнал событий, необходимо создать следующий ключ реестра:

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

Если поставщик из данного примера не должен записывать исключения в журнал событий, можно задать пользовательскому атрибуту writeExceptionsToEventLog значение false в файле Web.config.

Поддержка для события Session_OnEnd

Данный поставщик хранилища состояния сеанса не поддерживает событие Session_OnEnd, определенное в файле Global.asax, поскольку нет такого способа, с помощью которого база данных Access сообщит поставщику хранилища состояния сеанса дату окончания и время прохождения сеанса. Эти сведения должны быть запрошены поставщиком хранилища состояния сеанса. Нельзя предугадать, когда будет использован поставщик хранилища состояния сеанса, и поэтому маловероятно, что событие Session_OnEnd будет вызвано в точное время по истечении времени сеанса. В результате при реализации метода SetItemExpireCallback в поставщике хранилища состояния сеанса возвращается значение false, чтобы уведомить класс SessionStateModule о том, что событие Session_OnEnd не поддерживается.

Очистка просроченных данных сеанса

Поскольку поставщик хранилища состояния сеанса не предоставляет поддержки для события Session_OnEnd, просроченные данные сеанса не удаляются автоматически. Рекомендуется периодически удалять просроченные сведения о сеансе из хранилища данных со следующим кодом:

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();

Построение примера поставщика

Чтобы использовать пример поставщика, можно поместить исходный код в каталог приложения App_Code. Обратите внимание, что в том случае, если в этом каталоге уже имеется исходный код, необходимо добавить версию данного примера поставщика, написанную на том же языке, что и код, уже имеющийся в каталоге. Поставщик компилируется средствами ASP.NET при вызове приложения.

Также можно скомпилировать пример поставщика в качестве библиотеки и поместить эту библиотеку в каталог Bin веб-приложения, или же присвоить этой библиотеке строгое имя и поместить ее в глобальный кэш сборок (GAC). В следующей команде показано, как компилировать пример поставщика с помощью компилятора командной строки после того, как код примера копирован в файл OdbcSessionStateStore.vb (для Visual Basic) или OdbcSessionStateStore.cs (для 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

Использование примера поставщика в приложении ASP.NET

В следующем примере кода показано, как настроить файл Web.config для приложения ASP.NET на использование поставщика. В примере используется ODBC DSN SessionState, чтобы получить сведения о подключении для базы данных Access. Чтобы использовать поставщик, необходимо либо создать системный DSN SessionState, либо предоставить действительную строку соединения ODBC с базой данных.

Конфигурация примера предполагает, что веб-узел настроен на использование проверки подлинности с помощью форм и включает страницу ASP.NET с именем login.aspx, которая позволяет пользователям входить в систему:

<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>

См. также

Основные понятия

Реализация поставщика хранилища состояний сеансов

Общие сведения о состоянии сеанса ASP.NET

Общие сведения об управлении состоянием ASP.NET