ASP.NET Lab

The Best Web, The Best Future

博客园 首页 新随笔 订阅 管理

本文描述了一个使用 .NET Framework ODBC 数据提供者在 Access 数据库中管理会话信息的自定义会话状态存储提供者的实现。

如下主题包括一个实现了会话状态存储提供者的范例代码。该范例提供者使用 System.Data.Odbc 命名空间中的类来存储并获取 Access 数据库中的会话信息。

本文描述了会话状态存储提供者范例的实现细节并描述了如何建立范例并配置 ASP.NET 应用程序来使用该范例提供者。

范例提供者的代码能够在[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 文件中的自定义参数 writeExceptionToEventLog 设置成 false。

Session_OnEnd 事件的支持

范例会话状态存储提供者并不支持被定义在 Global.asax 文件中的 Session_OnEnd 事件,这与 Access 没有办法把已过期的会话期限日期和时间通知给会话状态存储提供者一样。会话状态存储提供者必须为这些信息而执行查询。你将无法预知会话状态存储提供者被使用的时间,以及 Session_OnEnd 事件将在超出了会话时间限制的时候地被引发的精确时间。结果,相同会话状态存储提供者中的 SetItemExpireCallback 方法实现将会返回 false,以通知 SessionStateModule 已经不再为 Session_OnEnd 事件提供支持。

清除已过期的会话数据

因为范例会话状态存储提供者并不提供对于 Session_OnEnd 事件的支持,所以它也不会自动清除已过期的会话项数据。建议你周期性地使用如下所示的代码从数据存储中删除已过期的会话信息。

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)中。如下所示的命令说明了如何使用命令行编译器在把范例代码复制成一个名为 OdbcSessionStateStore.cs 的文件后对范例提供者进行编译。

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 连接字符串。

该范例配置还假设了网站被设置成使用窗体验证并包括一个名为 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>
posted on 2007-01-20 17:23  Laeb  阅读(356)  评论(0编辑  收藏  举报