asp.net|session
ASP.NET提供了Session對象,從而允許程式員識別、儲存和處理同一個瀏覽器對象對伺服器上某個特定網路應用程式的若干次請求的上下文資訊。Session對應瀏覽器與伺服器的同一次對話,在瀏覽器第一請求網路應用程式的某個頁面時,伺服器會觸發Session_onStart事件;在對話逾時或者被關閉的時候會觸發Session_onEnd 事件。程式員可以在代碼中響應這兩個事件來處理與同一次對話相關的任務,如開闢和釋放該次對話要使用的資源等。
在ASP.NET的程式中要使用Session對象時,必須確保頁面的@page指令中EnableSessionState屬性是True或者Readonly,並且在web.config檔案中正確的設定了SessionState屬性。
ASP.NET中Session的狀態保持是由web.config檔案中的<system.web>標記下的<sessionstate>標記的mode屬性來決定的。該屬性有四種可能的值:Off、Inproc、StateServer和SQlServer.
設為Off會禁用Session.
Inproc是預設的設定,這種模式和以前的ASP的工作階段狀態的方法是類似的,會話的狀態會被儲存在ASP.NET進程中,它的優點是顯而易見的:效能。進程內的資料訪問自然會比誇進程的訪問快。然而,這種方法Session的狀態依賴於ASP.NET進程,當IIS進程崩潰或者正常重起啟時,儲存在進程中的狀態將丟失。
為了克服Inproc模式的缺點,ASP.NET提供了兩種進程外保持工作階段狀態的方法。
ASP.NET首先提供了提供了一個Windows服務:ASPState,這個服務啟動後,ASP.NET應用程式可以將mode屬性設定為“SateServer”,來使用這個Windows服務提供的狀態管理方法。
除了在web.config檔案中設定mode屬性為StateServer外,還必須設定運行StateServer伺服器的IP地址和連接埠號碼.如果在IIS所在的機器運行StateServer則IP地址就是127.0.0.1,連接埠號碼通常是42424.配置如下:
mode=”StateServer”
stateConnectionString="tcpip=127.0.0.1:42424"
使用這種模式,工作階段狀態的儲存將不依賴IIS進程的失敗或者重啟,會話的狀態將儲存在StateServer進程的記憶體空間中。
另一種工作階段狀態模式是SQLServer模式。這種模式是將會話的狀態儲存在SQL Server資料庫中的。使用這種模式前,必須至少有一台SQL Server伺服器,並在伺服器中建立需要的表和預存程序。.NET SDK提供了兩個指令碼來簡化這個工作:InstallSqlState.sql和UnInstallSqlState.sql。這兩國檔案存放在下面路徑中:
<%SYSTEMDRIVER%>\Winnt\Microsoft.NET\Framework\<%version%>\
要配置SQL Server 服務器,可以在命令列中運行SQL Server提供的命令列工具osql.exe
osql -s [server name] -u [user] -p [password] <InstallSqlState.sql
例如:
osql -s (local) -u as -p “”-i InstallSqlState.sql
做好必要的資料庫準備工作後,將web.config檔案中的sessionstate元素的mode屬性改為”sqlserver”,並指定SQL連接字串。具體如下:
mode="SQLServer"
sqlConnectionString="data source=127.0.0.1;userid=sa;password=;Trusted_Connection=yes"
使用SQLServer模式處了可以使Session的狀態不依賴於IIS伺服器之外,還可以利用SQL Server的叢集,使狀態儲存不依賴於單個的SQL Server,這樣就可以為應用程式提供極大的可靠性。