工作階段狀態存放區提供者範例
更新:2007 年 11 月
描述自訂的工作階段狀態存放區提供者實作,這個實作會使用 ODBC .NET Framework 資料提供者,來管理 Access 資料庫中的工作階段 (Session) 資訊。
下列主題包含範例工作階段狀態存放區提供者實作的程式碼。範例提供者會藉由使用 Access 資料庫,使用 System.Data.Odbc 類別 (Class) 來儲存和擷取工作階段資訊。
這個主題會描述工作階段狀態存放區提供者範例的實作詳細資訊、描述如何建置 (Build) 範例,以及設定 ASP.NET 應用程式來使用範例提供者。
您可以在 HOW TO:工作階段狀態存放區提供者範例主題中找到範例提供者的程式碼。
資料庫結構描述
工作階段狀態提供者範例會使用一個名為 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)
)
事件記錄檔存取
如果範例提供者在使用資料來源時遇到例外狀況,它會將例外狀況的詳細資料寫入至應用程式事件記錄檔,而不是將例外狀況 (Exception) 傳回給 ASP.NET 應用程式。這種做法是一種安全措施,可避免在 ASP.NET 應用程式中公開 (Expose) 資料來源的私人資訊。
範例提供者會指定 "OdbcSessionStateStore" 的事件 Source 屬性 (Property) 值。您需要建立下列登錄機碼,ASP.NET 應用程式才能夠順利寫入至應用程式事件記錄檔:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\OdbcSessionStateStore
如果您不想讓範例提供者將例外狀況 (Exception) 寫入至事件記錄檔,則可以在 Web.config 檔中將自訂的 writeExceptionsToEventLog 屬性 (Attribute) 設定為 false。
Session_OnEnd 事件支援
工作階段狀態存放區提供者範例不支援 Global.asax 檔中所定義的 Session_OnEnd 事件,這是因為 Access 資料庫沒有方法可將工作階段 (Session) 超過到期日和時間的這件事,告知工作階段狀態存放區提供者。工作階段狀態存放區提供者必須查詢這項資訊。由於您無法預測何時會使用工作階段狀態存放區提供者,因此無法在工作階段 (Session) 發生逾時狀況當時引發 Session_OnEnd 事件。因此,工作階段狀態存放區提供者範例中的 SetItemExpireCallback 方法實作會傳回 false,讓 SessionStateModule 知道 Session_OnEnd 事件不受支援。
清除過期的工作階段資料
因為工作階段狀態存放區提供者範例不支援 Session_OnEnd 事件,所以它不會自動清除過期的工作階段項目資料。建議您利用下列程式碼,定期刪除資料存放區中過期的工作階段 (Session) 資訊。
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 會編譯這個提供者 (Provider)。
您也可以將範例提供者編譯為程式庫,並且放在 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 連接字串 (Connection String)。
範例的組態會假設您的網站已設定為使用表單驗證,並包含名為 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>