ASP.NET/Session

維基教科書,自由的教學讀本

Session是伺服器對象,用於保持用戶的會話狀態。例如:

Session["key1"] = DateTime.Now;

用戶向伺服器提交請求時,伺服器會給用戶分配一個SessionId,保存在用戶瀏覽器的Cookies中。ASP.NET使用了120bit的標識符用以標識每個Session。這是足夠安全的、不可逆的設計。用戶頁面切換時,Session對象的變量不會被清除。 ASP.NET_SessionId是全局的,只要Cookies還存在,伺服器就會認為這是同一個用戶,從而實現了每個用戶都有自己獨立的全局Session域。當用戶再去請求的時候,在http頭把這個SessionID的Cookie發到伺服器端,伺服器就以這個SessionId作為key在伺服器端的Session中尋找;如果找到了就證明這個用戶的狀態是存在的。

關閉Session的辦法:

  • web.config的<configuration>\<system.web>\<httpModules>之中全局關閉:<sessionState mode="Off"/>
  • 在web.config中設置:<pages enableSessionState="ReadOnly"> 或True, False,
  • aspx頁的Page指令行,設置EnableSessionState為3個值之一:True, False, ReadOnly

從Session集合中移除所有項目,使用Session.Remove(strSessionName)或Session.RemoveAll()或Session.Clear();取消當前的Session,使用Session.Abandon()。

在ASP.NET中,有以下幾種Session模式可以使用:

  • InProc:可能會丟失數據,因為網站會各種原因可能重啟;Session保存的東西越多,就越佔用伺服器內存;伺服器的內存不能在多台伺服器間共享。在web.config中設置<sessionState mode="InProce" timeout="30" />
  • StateServer:在web.config中設置<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" stateNetworkTimeout="10" />。要求讀寫到Session中的類必須聲明為[Serializable]。
  • SQLServer:需要使用aspnet_regsql.exe配置數據庫,其命令行格式為-S ServerName -U username -P password -ssadd -sstype p。然後,SQL Server數據庫的ASPState庫將有兩張表:ASPStateTempApplications與ASPStateTempSessions。
  • Custom:從基類SessionStateStoreProviderBase開發出自定義的Provider,你也能通過實現ISessionIDManager接口來產生SessionID。需實現4個方法:
    • Initialize方法中,我們能設置一個自定義Provider。將提供給Provider初始化連接。
    • SetItemExpireCallback被用作提供SessionTimeOut(Session過期),當Session過期時我們能註冊一個方法進行調用。
    • InitializeRequest在請求發起的時候被調用
    • CreateNewStoreData在創建一個 SessionStateStoreData(Session數據存儲類)實例時候被調用。