介紹
我們知道,當瀏覽器關閉,或者網站重啟的時候,會話就結束了。即Seesion就丟失了。(當Web.config配置文件改動,哪怕什么內容都不加,僅僅往配置文件中加一個空格都是改we.config變配置文件,改變配置文件網站就會重啟。網站重啟進程內的Session就會丟失,而進程外的Seeion不會丟失)
注意:我們知道Cookie與Session的關系。 Cookie里保存的是SessionID 保存SessionID的這個Cookie是一個會話Cookie,會話Cookie一般就保存在本地瀏覽器進程的內存當中,只要當瀏覽器關閉,Cookie就消失了。
所有當瀏覽器關閉的時候,Cookie中保存的SessionID就消失了。而服務器里對應的Session還是存在的。
但是當瀏覽器沒有關閉,。但是網站重啟的情況下,即服務端的Session消失了(但是瀏覽器端Cookie里保存的SeesinID還在)
當一個網站的訪問量很大的時候,很容易就將服務端的Session充爆了(因為Sssion只占用那么一小塊內存)當Session被充爆后,它就會重啟Session池。重啟Session池的后果就是所有的Session全部丟失。 所有當瀏覽器帶着一個保存了SessionID的Cookie請求服務器的時候,服務器端又找不到對應的Session,就會報錯【“/”應用程序中的服務器錯誤。未將對象引用設置到對象的實例。】
所以,為了防止,服務端Seesion被充爆,導致Session丟失。我們就想到將Session保存到網站的進程之外。於是就有了出網站進程內的Session外的另外兩種Session.
進程外Session分為以下兩種:
1,狀態服務器Session (比網站進程內的Session慢一點。但是比占用的內存比進程內的Seesion大一點。比數據庫Session快很多,但是畢竟是內存,所以也是容易被充爆的)
2,數據庫Session (磁盤讀寫比內存速度慢,需要頻繁打開ADO.NET的連接速度也慢,好處是空間無限大,所以比較穩定,推薦使用)
狀態服務器Session的配置
首先開啟一個ASP.NET 狀態設置的服務
即:在 “我的電腦” 鼠標右鍵--->管理--->服務和應用程序----> 服務--->ASP.NET狀態服務(或者ASP.NET State Service)--->點擊右鍵選擇“啟動”
啟動ASP.NET狀態服務后,然后再Web.config配置文件中添加<sessionState>這個節點內容
<?xml version="1.0" encoding="utf-8"?> <!-- 有關如何配置 ASP.NET 應用程序的詳細信息,請訪問 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> <!--狀態服務器Session的配置 :添加這一段代碼--> <sessionState stateConnectionString="tcpip=127.0.0.1:42424" mode="StateServer"></sessionState> </system.web> </configuration>
這樣進程外Session就配置好了
怎么測試是否已經配置好了呢?
下面有一個關於用戶登陸的例子: ---------------------------------下面我們來看看這個例子:

Login.aspx文件
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="進程外Session.Login" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form id="form1" runat="server" method="post"> <div> <asp:Label ID="Label1" runat="server" Text="用戶名:"></asp:Label><asp:TextBox ID="txtUserName" runat="server"></asp:TextBox> <asp:Label ID="Label2" runat="server" Text="密碼:"></asp:Label><asp:TextBox ID="txtPassword" runat="server"></asp:TextBox> <input type="submit" value="提交" /> </div> </form> </body> </html>
Login.aspx.cs文件
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace 進程外Session { public partial class Login : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if(Request.HttpMethod.ToLower()=="post") { string userName = this.txtUserName.Text.Trim(); string password = this.txtPassword.Text.Trim(); if (userName == "abc" && password == "123456") { Session["userName"] = userName; Response.Redirect("News.aspx"); } else { Response.Write("<script> alert('登陸失敗!')</script>"); } } } } }
登陸成功跳轉的頁面:News.aspx頁面
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="News.aspx.cs" Inherits="進程外Session.News" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form id="form1" runat="server"> <div> 歡迎:<%=Session["userName"].ToString() %> 登陸。 </div> </form> </body> </html>
Web.config 文件
<?xml version="1.0" encoding="utf-8"?> <!-- 有關如何配置 ASP.NET 應用程序的詳細信息,請訪問 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> <!--狀態服務器Session添加這一段代碼--> <sessionState stateConnectionString="tcpip=127.0.0.1:42424" mode="StateServer"></sessionState> </system.web> </configuration>
首先我們來瀏覽一下這個Login.aspx這個網頁
在Login.aspx文件上右鍵點擊在瀏覽器中查看


點擊“提交”

此時已經證明Session已經保存好了的。但是我們怎么證明這個Session是進程外的Session還是進程內的Session呢?
我們知道,當瀏覽器關閉,或者網站重啟的時候,會話就結束了。即Seesion就丟失了。(當Web.config配置文件改動,哪怕什么內容都不加,僅僅往配置文件中加一個空格都是改we.config變配置文件,改變配置文件網站就會重啟。網站重啟Session就會丟失)
注意:我們知道Cookie與Session的關系。 Cookie里保存的是SessionID 保存SessionID的這個Cookie是一個會話Cookie,會話Cookie一般就保存在本地瀏覽器進程的內存當中,只要當瀏覽器關閉,Cookie就消失了。
所有當瀏覽器關閉的時候,Cookie中保存的SessionID就消失了。而服務器里對應的Session還是存在的。
但是當瀏覽器沒有關閉,。但是網站重啟的情況下,即服務端的Session消失了,但是瀏覽器端Cookie里保存的SeesinID還在
當一個網站的訪問量很大的時候,很容易就將服務端的Session充爆了(因為Sssion只占用那么一小塊內存)當Session被充爆后,它就會重啟Session池。重啟Session池的后果就是所有的Session全部丟失。 所有當瀏覽器帶着一個保存了SessionID的Cookie請求服務器的時候,服務器端又找不到對於的Session,就會報錯““/”應用程序中的服務器錯誤。未將對象引用設置到對象的實例。”
所以,為了防止,服務端Seesion被充爆,導致Session丟失。我們就想到將Session保存到網站的進程之外。於是就有了出網站進程內的Session外的另外兩種Session.
1,狀態服務器Session
2,數據庫Session
好了。當我們點擊提交,頁面跳轉到Naws.aspx頁面,頁面成功顯示了Session["userName"] 里保存的這個數據 abc
這個網頁我們別關閉,我們現在來改動一下Web.config,給Web.config配置文件隨便加一個空格,目的是重啟網站,然后點擊保存 。保存這個Web.config配置文件。
此時,我們再來刷新一下這個 剛剛跳轉過來的 http://localhost:39756/News.aspx 頁面 。我們會發現網站重啟了。但是這個進程外的Seesion並沒有消失,數據還在。
這就說明這個Session是保存在進程外的。
如果你不信,可以將配置文件中的這段 <sessionState stateConnectionString="tcpip=127.0.0.1:42424" mode="StateServer"></sessionState> 注釋掉試試!
數據庫Session的配置
怎么將Session記錄到數據庫中呢? 其實微軟已經為我們設置好了。只要我們簡單的配置一下就行了。
當然也要在 “我的電腦” 鼠標右鍵--->管理--->服務和應用程序----> 服務--->ASP.NET狀態服務(或者ASP.NET State Service)--->點擊右鍵選擇“啟動”(楊中科說數據庫Session的配置不需要啟動ASP.NET狀態服務器,我本人沒測試過,暫時屏蔽這段話,老楊最大嘛)
首先。我們進入C盤下的 Windows文件夾 下的Microsoft.Net文件夾下的Framework/Framework64文件夾下的v4.0.30319文件夾下:找到aspnet_regsql 文件。
具體的路徑是: C:\Windows\Microsoft.NET\Framework64\v4.0.30319
然后:快捷鍵win+R調出cmd 命令窗口
在cmd中進入C:\Windows\Microsoft.NET\Framework64\v4.0.30319文件夾下
即:在cmd 命令中輸入:cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319

然后執行 aspnet_regsql.exe -S wyt\MSSQLSERVER2008R -U sa -P 123456 -ssadd -sstype c -d zhangshangzu
解釋一下 aspnet_regsql.exe表示執行這個文件 ,-S 后接的參數為數據庫服務器的名稱或者IP地址;-U 表示SqlServer的登陸用戶名是sa ,-P 表示登陸密碼是123456 最后面的zhangshangzu是數據庫名,即:你要將Session保存到哪個數據庫下。
點擊回車鍵后,直到執行完畢

以上運行完畢后,我們打開SqlServer ,找到sales數據庫。我們發現下面給我們自動生成了兩個表
<?xml version="1.0" encoding="utf-8"?> <!-- 有關如何配置 ASP.NET 應用程序的詳細信息,請訪問 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> <!--進程外Session添加這一段代碼--> <!--<sessionState stateConnectionString="tcpip=127.0.0.1:42424" mode="StateServer"></sessionState>--> <!--數據庫Session配置文件--> <!--timeout是設置Session過期時間,這里設為1000分鍾。如果不設置,則默認為20分鍾--> <sessionState sqlConnectionString="server=.;database=sales;uid=sa;pwd=123456" allowCustomSqlDatabase="true" mode="SQLServer" timeout="1000"></sessionState> </system.web> </configuration>
發現Session已經寫入到數據庫表中了。
