對(duì)于asp.net 程序員來說,Session的存儲(chǔ)方式有InProc、StateServer、SQLServer和Custom,但是Custom確很少有人提及。但Custom確實(shí)最好用,目前最實(shí)用和最靈活一種方式,因?yàn)镃ustom可以實(shí)現(xiàn)各種情況的Session存儲(chǔ),特別對(duì)于大型網(wǎng)站尤為重要,解決Session丟失和Session效率的最佳實(shí)現(xiàn)方式,也是實(shí)現(xiàn)單點(diǎn)登錄的最佳途徑。 對(duì)于InProc、StateServer和SQLServer各自優(yōu)缺點(diǎn),網(wǎng)上一大堆,這里就不做詳解。
重要的兩點(diǎn)
1、首先是關(guān)于Session存儲(chǔ),Session的存儲(chǔ)并不是我們想象的,當(dāng)設(shè)置Session時(shí)立即往數(shù)據(jù)容器里插入或者修改數(shù)據(jù),當(dāng)獲取Session的值時(shí)就是立即去數(shù)據(jù)容器里獲取值,這種理解是錯(cuò)誤的(我之前就是這樣理解的)。后來想想完全沒必要這樣操作,而且會(huì)大大影響效率。Asp.net的Session實(shí)現(xiàn)方式是每次請(qǐng)求前獲取數(shù)據(jù),當(dāng)請(qǐng)求邏輯代碼結(jié)束的時(shí)候在設(shè)置Session的值,所以說Session對(duì)數(shù)據(jù)容器的修改簡(jiǎn)單的意義只有兩次,這個(gè)可能就要牽扯到管道流了。
2、第二個(gè)就是關(guān)于Asp.net網(wǎng)站異步的問題,當(dāng)我們不設(shè)置Session的狀態(tài)為只讀時(shí),我們每個(gè)用戶的請(qǐng)求其實(shí)都是同步的,也就說每個(gè)用戶請(qǐng)求網(wǎng)站同時(shí)只能有一個(gè)請(qǐng)求響應(yīng)。理解這個(gè)就可以理解后面實(shí)現(xiàn)方法中需要鎖的概念了。
SessionStateStoreProviderBase
SessionStateStoreProviderBase是asp.net框架為我們提供的一個(gè)用來存儲(chǔ)Session提供程序所需的成員(就是實(shí)現(xiàn)這個(gè)類),我們知道的InProc、SQLServer都是實(shí)現(xiàn)了這個(gè)抽象類,StateServer應(yīng)該也是沒驗(yàn)證。繼承這個(gè)類需要有多個(gè)抽象方法需要實(shí)現(xiàn)。關(guān)于這多個(gè)方法沒必要每個(gè)都實(shí)現(xiàn),我們只關(guān)注我們需要實(shí)現(xiàn)的即可。說簡(jiǎn)單點(diǎn)就是對(duì)Session數(shù)據(jù)的增刪改查(CRUD)。關(guān)于SessionStateStoreProviderBase的詳情可以參考https://msdn.microsoft.com/zh-cn/library/system.web.sessionstate.sessionstatestoreproviderbase(v