会话状态存储提供程序示例

更新:2007 年 11 月

描述了自定义的会话状态存储提供程序实现,该实现使用 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 应用程序中公开有关数据源的私有信息.

该示例提供程序指定了“OdbcSessionStateStore”的事件 Source 属性值。在 ASP.NET 应用程序能够成功写入应用程序事件日志之前,需要创建下面的注册表项:

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

如果不想让示例提供程序将异常写入事件日志,则可以在 Web.config 文件中将自定义 writeExceptionsToEventLog 属性设置为 false。

对 Session_OnEnd 事件的支持

示例会话状态存储提供程序不支持在 Global.asax 文件中定义的 Session_OnEnd 事件,原因是 Access 数据库无法将会话的到期日期和时间已过的信息通知会话状态存储提供程序。会话状态存储提供程序必须查询该信息。您无法预知何时将使用会话状态存储提供程序,因此不大可能在会话超时的准确时刻引发 Session_OnEnd 事件。因此,示例会话状态存储提供程序中的 SetItemExpireCallback 方法实现返回 false,以通知 SessionStateModuleSession_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 目录下。请注意,如果您的应用程序的 App_Code 目录中已经有源代码,则您必须添加使用与目录中现有代码相同的语言编写的示例提供程序版本。当请求您的应用程序时,ASP.NET 将对该提供程序进行编译。

您也可以将示例提供程序作为库进行编译,并将其放入 Web 应用程序的 Bin 目录中,或对其进行强命名并放入 GAC 中。下面的命令演示在将示例代码复制到 Visual Basic 的 OdbcSessionStateStore.vb 文件和 C# 的 OdbcSessionStateStore.cs 文件中之后如何使用命令行编译器编译示例提供程序。

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 应用程序中使用示例提供程序

下面的示例演示一个已配置为使用示例提供程序的 ASP.NET 应用程序的 Web.config 文件。该示例使用名为“SessionState”的 ODBC DSN 来获取 Access 数据库的连接信息。若要使用示例提供程序,您需要创建“SessionState”系统 DSN,或提供到您的数据库的有效 ODBC 连接字符串。

此示例配置假设您的网站设置为使用 Forms 身份验证,并包括允许用户登录的名为 login.aspx 的 ASP.NET 页面。

<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 状态管理概述