對于asp.net 程序員來說,Session的存儲方式有InProc、StateServer、SQLServer和Custom,但是Custom確很少有人提及。但Custom確實最好用,目前最實用和最靈活一種方式,因為Custom可以實現(xiàn)各種情況的Session存儲,特別對于大型網(wǎng)站尤為重要,解決Session丟失和Session效率的最佳實現(xiàn)方式,也是實現(xiàn)單點登錄的最佳途徑。 對于InProc、StateServer和SQLServer各自優(yōu)缺點,網(wǎng)上一大堆,這里就不做詳解。

 

重要的兩點

 1、首先是關(guān)于Session存儲,Session的存儲并不是我們想象的,當設(shè)置Session時立即往數(shù)據(jù)容器里插入或者修改數(shù)據(jù),當獲取Session的值時就是立即去數(shù)據(jù)容器里獲取值,這種理解是錯誤的(我之前就是這樣理解的)。后來想想完全沒必要這樣操作,而且會大大影響效率。Asp.net的Session實現(xiàn)方式是每次請求前獲取數(shù)據(jù),當請求邏輯代碼結(jié)束的時候在設(shè)置Session的值,所以說Session對數(shù)據(jù)容器的修改簡單的意義只有兩次,這個可能就要牽扯到管道流了。

2、第二個就是關(guān)于Asp.net網(wǎng)站異步的問題,當我們不設(shè)置Session的狀態(tài)為只讀時,我們每個用戶的請求其實都是同步的,也就說每個用戶請求網(wǎng)站同時只能有一個請求響應。理解這個就可以理解后面實現(xiàn)方法中需要鎖的概念了。

 

SessionStateStoreProviderBase

  SessionStateStoreProviderBase是asp.net框架為我們提供的一個用來存儲Session提供程序所需的成員(就是實現(xiàn)這個類),我們知道的InProc、SQLServer都是實現(xiàn)了這個抽象類,StateServer應該也是沒驗證。繼承這個類需要有多個抽象方法需要實現(xiàn)。關(guān)于這多個方法沒必要每個都實現(xiàn),我們只關(guān)注我們需要實現(xiàn)的即可。說簡單點就是對Session數(shù)據(jù)的增刪改查(CRUD)。關(guān)于SessionStateStoreProviderBase的詳情可以參考https://msdn.microsoft.com/zh-cn/library/system.web.sessionstate.sessionstatestoreproviderbase(v