第四節:框架前期準備篇之進程外Session的兩種配置方式

一. 基本介紹

1. 背景:Asp.Net默認的Session機制是進程內,存儲在服務器端內存中,有這麼幾個缺點:

①:既然存在內存中,空間有限,不能存儲大數據量信息,數據量多的話Session會被擠爆。

②:IIS只要一重啟,Session就會丟失,哪怕就是改一下配置文件,IIS也會重啟,此時如果客戶端有用戶通過瀏覽器正在訪問該網站,如果用到Session,原Session是丟失的了,就會報“未將對象引用設置到對象的實例”類似的錯誤。

③:Session是依賴Cookie來保存SessionID的,所以如果瀏覽器禁用Cookie,那麼Session也是不能用的。【PS:即使使用進程外Session解決不了這個問題】

默認進程內的Session的優點:讀寫速度快。

進程內Session的配置代碼:

在System.Web 節點下加:<sessionstate> ,30代表30分過期,默認為20分鐘過期。

2. Session和Cookie的關係

這裡簡單說一下:Session是一個Key-Value集合,而這個Key即SessionID是存儲在瀏覽器的Cookie中的,Cookie默認的生命週期是瀏覽器的生明週期,瀏覽器關閉,cookie消失,所以當瀏覽器關閉後再重新打開,Cookie消失,原SessionID消失,即使服務器端Session還存在,客戶端也無從獲取了。

詳細的Session介紹詳見:http://www.cnblogs.com/yaopengfei/p/8057176.html 中的第 5 點

3. 進程外Session的種類

① 狀態服務器Session:比默認的進程內Session稍慢一點,比數據庫Session慢很多,存儲空間比進程內的稍大一些, 但畢竟還是存儲在內存中的,空間是有限,也會容易被擠爆。

② 數據庫Session:這裡以SQLServer為例,因為微軟有些工作已經給做好了,簡單配置一下就行了. 數據庫Session的讀寫速度 要慢,但好處是可以認為空間“無限大”,並且相對穩定。

PS:上述僅是為了介紹兩種通用的方式,很多情況下,可以使用NoSQL來存儲信息,要比關係型數據庫讀寫快的多。

4. 進程外Session解決的問題

解決了IIS重啟Session丟失的問題,解決了Session空間有限容易被擠爆的問題,但不能解決瀏覽器重啟找不到Session的問題!

二. 狀態服務器Session

步驟一:

以win10為例,運行services.msc,打開服務列表,找到【ASP.NET State Service】,右鍵啟動即可。

第四節:框架前期準備篇之進程外Session的兩種配置方式

步驟二:

在<system.web>節點下加上下面一句話 <sessionstate>/<system.web>

PS:狀態服務器端口默認為:42424,該模式無法支持負載均衡,如有需要,採用數據庫Session的形式。

如何修改默認端口?

打開註冊表 [HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/aspnet_state/Parameters],其中:Port為端口號,十進制,默認即為42424; AllowRemoteConnection的值 0代表僅能本機使用,1代表供其他機器使用.

第四節:框架前期準備篇之進程外Session的兩種配置方式

三. 數據庫Session

步驟一:

cmd 進入這個路徑 C:\Windows\Microsoft.NET\Framework\v4.0.30319

步驟二:

運行指令 aspnet_regsql.exe -U sa -P 123456 -ssadd -sstype c -d MagicDB

ps:sa為數據庫登錄名 123456為數據庫密碼 MagicDB為存儲Session的數據庫

運行完畢後,會發現該數據庫下多了兩張表,分別是:ASPStateTempApplications 和 ASPStateTempSessions,如下圖:

第四節:框架前期準備篇之進程外Session的兩種配置方式

步驟三:

在<system.web>節點下加上下面一句話:/<system.web>

<sessionstate>

PS:默認過期時間為20分鐘,上述代碼將過期時間設置為1000分鐘。

補充:寫入數據庫Session中的信息如果是實體的話,需要可序列化,否則不能寫入。

第四節:框架前期準備篇之進程外Session的兩種配置方式

四. 測試

分享測試代碼:

 1 /// <summary>
2 /// 測試頁面
3 /// /<summary>
4 /// <returns>
5 public ActionResult Index()
6 {
7 if (Session["test"]==null)
8 {
9 ViewBag.msg = "沒有數據了";
10 Session["test"] = "ypf";
11 }
12 else
13 {
14 ViewBag.msg = Session["test"];
15 }
16 return View();
17 }

將該項目項目發佈到IIS,默認第一次進入顯示“沒有數據了”,刷新一下,顯示“ypf”,此時重啟IIS,再次刷新頁面,仍然顯示“ypf”,證明進程外Session有效。

第一次訪問:

第四節:框架前期準備篇之進程外Session的兩種配置方式

刷新瀏覽器:

第四節:框架前期準備篇之進程外Session的兩種配置方式

重啟IIS,刷新瀏覽器:

第四節:框架前期準備篇之進程外Session的兩種配置方式


分享到:


相關文章: