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

一. 基本介紹html

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

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

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

  ③:Session是依賴Cookie來保存SessionID的,因此若是瀏覽器禁用Cookie,那麼Session也是不能用的。【PS:即便使用進程外Session解決不了這個問題】服務器

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

進程內Session的配置代碼:session

   在System.Web 節點下加:<sessionState mode="InProc" timeout="30"/> ,30表明30分過時,默認爲20分鐘過時。負載均衡

2. Session和Cookie的關係tcp

  這裏簡單說一下: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】,右鍵啓動便可。

步驟二:

  在<system.Web>節點下加上下面一句話 <sessionState stateConnectionString="tcpip=127.0.0.1:42424" mode="StateServer">

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

如何修改默認端口?

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

 

 

三. 數據庫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,以下圖:

步驟三:

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

   <sessionState sqlConnectionString="server=.;database=MagicDB;uid=sa;pwd=123456" allowCustomSqlDatabase="true" mode="SQLServer" timeout="1000"></sessionState>

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

補充:寫入數據庫Session中的信息若是是實體的話,須要可序列化,不然不能寫入。

四. 測試

 分享測試代碼:

 1   /// <summary>
 2   /// 測試頁面
 3   /// </summary>
 4   /// <returns></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有效。

 第一次訪問:

 

刷新瀏覽器:

 

重啓IIS,刷新瀏覽器:

 

 

 

 

!

  • 做       者 : Yaopengfei(姚鵬飛)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 聲     明1 : 本人才疏學淺,用郭德綱的話說「我是一個小學生」,若有錯誤,歡迎討論,請勿謾罵^_^。
  • 聲     明2 : 原創博客請在轉載時保留原文連接或在文章開頭加上本人博客地址,不然保留追究法律責任的權利。
相關文章
相關標籤/搜索