第四节:框架前期准备篇之进程外Session的两种配置方式
一. 基本介紹
1. 背景:Asp.Net默認(rèn)的Session機(jī)制是進(jìn)程內(nèi),存儲(chǔ)在服務(wù)器端內(nèi)存中,有這么幾個(gè)缺點(diǎn):
①:既然存在內(nèi)存中,空間有限,不能存儲(chǔ)大數(shù)據(jù)量信息,數(shù)據(jù)量多的話Session會(huì)被擠爆。
②:IIS只要一重啟,Session就會(huì)丟失,哪怕就是改一下配置文件,IIS也會(huì)重啟,此時(shí)如果客戶端有用戶通過(guò)瀏覽器正在訪問(wèn)該網(wǎng)站,如果用到Session,原Session是丟失的了,就會(huì)報(bào)“未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例”類似的錯(cuò)誤。
③:Session是依賴Cookie來(lái)保存SessionID的,所以如果瀏覽器禁用Cookie,那么Session也是不能用的。【PS:即使使用進(jìn)程外Session解決不了這個(gè)問(wèn)題】
?默認(rèn)進(jìn)程內(nèi)的Session的優(yōu)點(diǎn):讀寫速度快。
進(jìn)程內(nèi)Session的配置代碼:
? 在System.Web 節(jié)點(diǎn)下加:<sessionState mode="InProc" timeout="30"/> ,30代表30分過(guò)期,默認(rèn)為20分鐘過(guò)期。
2. Session和Cookie的關(guān)系
這里簡(jiǎn)單說(shuō)一下:Session是一個(gè)Key-Value集合,而這個(gè)Key即SessionID是存儲(chǔ)在瀏覽器的Cookie中的,Cookie默認(rèn)的生命周期是瀏覽器的生明周期,瀏覽器關(guān)閉,cookie消失,所以當(dāng)瀏覽器關(guān)閉后再重新打開,Cookie消失,原SessionID消失,即使服務(wù)器端Session還存在,客戶端也無(wú)從獲取了。
?詳細(xì)的Session介紹詳見:http://www.cnblogs.com/yaopengfei/p/8057176.html?中的第 5 點(diǎn)
3. 進(jìn)程外Session的種類
① 狀態(tài)服務(wù)器Session:比默認(rèn)的進(jìn)程內(nèi)Session稍慢一點(diǎn),比數(shù)據(jù)庫(kù)Session慢很多,存儲(chǔ)空間比進(jìn)程內(nèi)的稍大一些,?但畢竟還是存儲(chǔ)在內(nèi)存中的,空間是有限,也會(huì)容易被擠爆。
② 數(shù)據(jù)庫(kù)Session:這里以SQLServer為例,因?yàn)槲④浻行┕ぷ饕呀?jīng)給做好了,簡(jiǎn)單配置一下就行了. 數(shù)據(jù)庫(kù)Session的讀寫速度?要慢,但好處是可以認(rèn)為空間“無(wú)限大”,并且相對(duì)穩(wěn)定。
?PS:上述僅是為了介紹兩種通用的方式,很多情況下,可以使用NoSQL來(lái)存儲(chǔ)信息,要比關(guān)系型數(shù)據(jù)庫(kù)讀寫快的多。
4. 進(jìn)程外Session解決的問(wèn)題
解決了IIS重啟Session丟失的問(wèn)題,解決了Session空間有限容易被擠爆的問(wèn)題,但不能解決瀏覽器重啟找不到Session的問(wèn)題!
??
?
二. 狀態(tài)服務(wù)器Session
步驟一:
以win10為例,運(yùn)行services.msc,打開服務(wù)列表,找到【ASP.NET State Service】,右鍵啟動(dòng)即可。
步驟二:
在<system.Web>節(jié)點(diǎn)下加上下面一句話?<sessionState stateConnectionString="tcpip=127.0.0.1:42424" mode="StateServer">
?PS:狀態(tài)服務(wù)器端口默認(rèn)為:42424,該模式無(wú)法支持負(fù)載均衡,如有需要,采用數(shù)據(jù)庫(kù)Session的形式。
如何修改默認(rèn)端口?
? 打開注冊(cè)表 [HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/aspnet_state/Parameters],其中:Port為端口號(hào),十進(jìn)制,默認(rèn)即為42424;?AllowRemoteConnection的值 0代表僅能本機(jī)使用,1代表供其他機(jī)器使用.
?
?
三. 數(shù)據(jù)庫(kù)Session
步驟一:
?cmd 進(jìn)入這個(gè)路徑 C:\Windows\Microsoft.NET\Framework\v4.0.30319
步驟二:
運(yùn)行指令 aspnet_regsql.exe -U sa -P 123456 -ssadd -sstype c -d MagicDB
ps:sa為數(shù)據(jù)庫(kù)登錄名 123456為數(shù)據(jù)庫(kù)密碼 MagicDB為存儲(chǔ)Session的數(shù)據(jù)庫(kù)
運(yùn)行完畢后,會(huì)發(fā)現(xiàn)該數(shù)據(jù)庫(kù)下多了兩張表,分別是:ASPStateTempApplications 和 ASPStateTempSessions,如下圖:
步驟三:
在<system.Web>節(jié)點(diǎn)下加上下面一句話:
? <sessionState sqlConnectionString="server=.;database=MagicDB;uid=sa;pwd=123456" allowCustomSqlDatabase="true" mode="SQLServer" timeout="1000"></sessionState>
PS:默認(rèn)過(guò)期時(shí)間為20分鐘,上述代碼將過(guò)期時(shí)間設(shè)置為1000分鐘。
補(bǔ)充:寫入數(shù)據(jù)庫(kù)Session中的信息如果是實(shí)體的話,需要可序列化,否則不能寫入。
四. 測(cè)試
?分享測(cè)試代碼:
1 /// <summary>2 /// 測(cè)試頁(yè)面3 /// </summary>4 /// <returns></returns>5 public ActionResult Index()6 {7 if (Session["test"]==null)8 {9 ViewBag.msg = "沒有數(shù)據(jù)了"; 10 Session["test"] = "ypf"; 11 } 12 else 13 { 14 ViewBag.msg = Session["test"]; 15 } 16 return View(); 17 }將該項(xiàng)目項(xiàng)目發(fā)布到IIS,默認(rèn)第一次進(jìn)入顯示“沒有數(shù)據(jù)了”,刷新一下,顯示“ypf”,此時(shí)重啟IIS,再次刷新頁(yè)面,仍然顯示“ypf”,證明進(jìn)程外Session有效。
?第一次訪問(wèn):
?
刷新瀏覽器:
?
重啟IIS,刷新瀏覽器:
?
?
?
?
!
- 作???????者 :?Yaopengfei(姚鵬飛)
- 博客地址 :?http://www.cnblogs.com/yaopengfei/
- 聲?????明1 : 本人才疏學(xué)淺,用郭德綱的話說(shuō)“我是一個(gè)小學(xué)生”,如有錯(cuò)誤,歡迎討論,請(qǐng)勿謾罵^_^。
- 聲?????明2 : 原創(chuàng)博客請(qǐng)?jiān)谵D(zhuǎn)載時(shí)保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責(zé)任的權(quán)利。
?
總結(jié)
以上是生活随笔為你收集整理的第四节:框架前期准备篇之进程外Session的两种配置方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 华为自研编程语言:下半年见!
- 下一篇: 董宇辉吐槽自己的iPhone XS刷微博