Session持久化方法

        關於Session持久化這方面的話題,有很多人已經寫過了,但是,畢竟這是我的項目經驗,更加真實,可用。
    進入主題。情景一,Session ID在客戶端的狀態
        情景一中,saved in cookies
情況
        
ID保存在client端的Cookies集合中
        缺點是,如果client端的cookie被禁用,那麼ID無法保存
        
設置cookieless="false"

<sessionState
mode=
"InProc"
stateConnectionString=
"tcpip=127.0.0.1:42424"
sqlConnectionString=
"datasource=127.0.0.1;userid=sa;password="
cookieless=
"false"
timeout="20"/>



情景一中,saved in url情況
        
MS爲了解決cookie被禁時,也能正常保存ID,在.net2.0中可以把ID保存在URL中.
        
設置cookieless="true"


<sessionState
   
mode="InProc"
   
stateConnectionString="tcpip=127.0.0.1:42424"
   
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
   
cookieless="true"
   
timeout="20"/>



情景二,Session狀態在服務器中的三中模式,進程內、進程外、數據庫。
            
情景二中,saved in 進程內
            
設置mode="InProc"
            
優點;保存在本機內存中,無需跨網絡,訪問內存速度快
            
缺點;如果IIS進程發生異常或者WebSite有文件變更,都被asp.netRuntime監視,然後重新設置Session狀態


<sessionState
            
mode="InProc"
         
stateConnectionString="tcpip=127.0.0.1:42424"
            
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
            
cookieless="false"
            
timeout="20"/>



情景二中,saved in 進程外
           
設置mode="StateServer",啓動asp.net狀態服務
           
定位註冊表
            
“HKEY_LOCAL_MACHINE/SYSTEM/ControlSett001/Services/aspnet_state/Parameters“修改AllowRemoteConnection=1,Port=42424
           注意這些參數都是十進制類型,且這些設置是在訪問遠程asp.net狀態服務的必要設置。
           
優點;穩定,即使關閉WWW服務,只要啓動asp.net狀態服務,Session狀態依然存在,不信你試試。
           
如果把狀態保存在非本機上只需修改上面的註冊表,修改stateConnectionString="tcpip=RemoteIP:Remoteport",
           如果狀態保存在遠程機上的asp.net狀態服務中,那麼當頁面關閉的時候,Session狀態馬上失效,
           不管你的狀態保存時間設置時間有多長,一律失效
           不信可以考試試,^-^。


<sessionState
        
mode="StateServer"
   
    stateConnectionString="tcpip=127.0.0.1:42424"
        
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
        cookieless="false"
   
    timeout="20"/>


       情景二中,saved in 數據庫
      
設置
      
mode="SQLServer"
      
sqlConnectionString="datasource=127.0.0.1;userid=sa;password="
      
啓動SqlServer和SqlServerAgent。
      
定位到[systemdrive]/winnt/Microsoft.NET/Framework/[version]/
      
執行InstallSqlState.sql。
      
然後我們看tempdb數據庫中多了兩個用戶表,而且多了一個ASPstate的空庫,ASPStateTempApplicationsASPStateTempApplications表中
       存儲的是應用程序信息,每個應用程序在啓動的時候在這裏會註冊一條記錄,包括應用程序的
ID(通過哈希算法生成的)和應用程序名稱,
       實際上Session信息是存儲在了tempdb數據庫的ASPStateTempSessions表中,另外查看管理->SQLServer代理->作業,
       發現也多了一個叫做
ASPState_Job_DeleteExpiredSessions的作業,這個作業實際上就是每分鐘去ASPStateTempSessions表中刪除過期的Session信息。

新建一個Asp.netWebSite,F5,一切OK
效果圖形
兩張表

ASPStateTempApplications表的數據

ASPStateTempSessions表的數據

ASPState_Job_DeleteExpiredSessions作業


需要注意的地方;
一,ASPStateTempApplicationsASPStateTempSessions表的權限用戶是sa,既管理員。
二,啓動MsSqlSeverAgent用來執行清除過期Session的作業ASPState_Job_DeleteExpiredSessions
三,如果MsSqlServerWebSite不在同一臺機器上,那麼設置sqlConnectionString="datasource=RemoteIP;userid=userName;password=userpwd"
結束
    寫得不妥之處,請多多指教!
發佈了23 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章