程序外Session | 狀態伺服器Session 和 資料庫Session的設定
介紹
我們知道,當瀏覽器關閉,或者網站重啟的時候,會話就結束了。即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資料夾下的v4.0.30319資料夾下:找到aspnet_regsql 檔案。
具體的路徑是: C:\Windows\Microsoft.NET\Framework\v4.0.30319
然後:快捷鍵win+R調出cmd 命令視窗
在cmd中進入C:\Windows\Microsoft.NET\Framework\v4.0.30319資料夾下
即:在cmd 命令中輸入:cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
然後執行 aspnet_regsql.exe -U sa -P 123456 -ssadd -sstype c -d sales
解釋一下 aspnet_regsql.exe表示執行這個檔案 ,-U 表示SqlServer的登陸使用者名稱是sa ,-P 表示登陸密碼是123456 最後面的sales 是資料庫名,即:你要將Session儲存到哪個資料庫下。
點選回車鍵後,直到執行完畢
我們在來配置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>-->
<!--資料庫Session配置檔案-->
<!--timeout是設定Session過期時間,這裡設為1000分鐘。如果不設定,則預設為20分鐘-->
<sessionState sqlConnectionString="server=.;database=sales;uid=sa;pwd=123456" allowCustomSqlDatabase="true" mode="SQLServer" timeout="1000"></sessionState>
</system.web>
</configuration>
然後我們瀏覽上面那個登陸的例子的Login.aspx檔案填上使用者名稱:abc 密碼:123456 後,就跳轉到了http://localhost:39756/News.aspx 檔案此時證明Session["userName"] 的值abc已經寫入Session了。我們在開啟SqlServer 在sales 資料庫下找到ASPStateTempSessions 表查詢所有資料
發現Session已經寫入到資料庫表中了。