次の方法で共有


サンプル セッション状態ストア プロバイダ

更新 : 2007 年 11 月

ODBC .NET Framework データ プロバイダを使用して Access データベースのセッション情報を管理するカスタム セッション状態ストア プロバイダの実装について説明します。

次の各トピックでは、サンプル セッション状態ストア プロバイダを実装するためのコードについて説明します。サンプル プロバイダでは、System.Data.Odbc クラスを使用して、Access データベースを使用することによってセッション情報を格納し、取得します。

このトピックでは、サンプル セッション状態ストア プロバイダの実装について詳しく説明し、サンプルをビルドしてサンプル プロバイダを使用するように ASP.NET アプリケーションを構成する方法を説明します。

サンプル プロバイダのコードは、「方法 : セッション状態ストア プロバイダのサンプル」のトピックにあります。

データベース スキーマ

サンプル セッション状態プロバイダでは、Sessions という 1 つのテーブルを使用してセッション情報を管理します。サンプル プロバイダで使用する 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 が返されて Session_OnEnd イベントがサポートされていないことが SessionStateModule に通知されます。

有効期限切れのセッション データの削除

サンプル セッション状態ストア プロバイダは 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 に配置することもできます。次のコマンドでは、サンプル コードを 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 アプリケーションでのサンプル プロバイダの使用

ASP.NET アプリケーションでサンプル プロバイダを使用するように設定した Web.config ファイルの例を次に示します。この例では、"SessionState" という ODBC DSN を使用して Access データベースの接続情報を取得します。サンプル プロバイダを使用するには、"SessionState" というシステム DSN を作成するか、有効な ODBC 接続文字列をデータベースに提供する必要があります。

この構成例では、Web サイトがフォーム認証を使用するように設定されていて、ユーザーのログインを許可する 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 の状態管理の概要