다음을 통해 공유


샘플 세션 상태 저장소 공급자

업데이트: 2007년 11월

여기에서는 ODBC .NET Framework 데이터 공급자를 사용하여 Access 데이터베이스의 세션 정보를 관리하는 사용자 지정 세션 상태 저장소 공급자 구현을 설명합니다.

다음 항목에는 샘플 세션 상태 저장 공급자 구현을 위한 코드가 포함되어 있습니다. 샘플 공급자는 Access 데이터베이스를 사용하여 세션 정보를 저장하고 검색하는 데 System.Data.Odbc 클래스를 사용합니다.

이 항목에서는 샘플 세션 상태 저장 공급자의 구현에 대해 자세히 설명하고 샘플을 빌드하는 방법과 샘플 공급자를 사용하도록 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

샘플 공급자가 이벤트 로그에 예외를 기록하지 않도록 하려면 Web.config 파일에서 사용자 지정 writeExceptionsToEventLog 특성을 false로 설정합니다.

Session_OnEnd 이벤트 지원

Access 데이터베이스에서는 세션의 만료 날짜 및 시간이 경과했음을 세션 상태 저장소 공급자에 알릴 수 없으므로 샘플 세션 상태 저장소 공급자는 Global.asax 파일에 정의된 Session_OnEnd 이벤트를 지원하지 않습니다. 따라서 세션 상태 저장소 공급자가 이 정보를 쿼리해야 합니다. 세션 상태 저장소 공급자가 사용될 시기는 예측할 수 없으므로 세션 시간이 종료되는 정확한 시간에 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에서 컴파일됩니다.

또한 샘플 공급자를 라이브러리로 컴파일한 다음 웹 응용 프로그램의 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"라는 System 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>

참고 항목

개념

세션 상태 저장소 공급자 구현

ASP.NET 세션 상태 개요

ASP.NET 상태 관리 개요