Asp.Net進程外Session(狀態服務器Session、數據庫Session)

介紹

咱們知道,當瀏覽器關閉,或者網站重啓的時候,會話就結束了。即Seesion就丟失了。(當Web.config配置文件改動,哪怕什麼內容都不加,僅僅往配置文件中加一個空格都是改we.config變配置文件,改變配置文件網站就會重啓。網站重啓進程內的Session就會丟失,而進程外的Seeion不會丟失)html

注意:咱們知道Cookie與Session的關係。 Cookie裏保存的是SessionID  保存SessionID的這個Cookie是一個會話Cookie,會話Cookie通常就保存在本地瀏覽器進程的內存當中,只要當瀏覽器關閉,Cookie就消失了。web

全部當瀏覽器關閉的時候,Cookie中保存的SessionID就消失了。而服務器裏對應的Session仍是存在的。sql

可是當瀏覽器沒有關閉,。可是網站重啓的狀況下,即服務端的Session消失了(可是瀏覽器端Cookie裏保存的SeesinID還在)數據庫

當一個網站的訪問量很大的時候,很容易就將服務端的Session充爆了(由於Sssion只佔用那麼一小塊內存)當Session被充爆後,它就會重啓Session池。重啓Session池的後果就是全部的Session所有丟失。 全部當瀏覽器帶着一個保存了SessionID的Cookie請求服務器的時候,服務器端又找不到對應的Session,就會報錯【「/」應用程序中的服務器錯誤。未將對象引用設置到對象的實例。】瀏覽器

因此,爲了防止,服務端Seesion被充爆,致使Session丟失。咱們就想到將Session保存到網站的進程以外。因而就有了出網站進程內的Session外的另外兩種Session.服務器

進程外Session分爲如下兩種:session

1,狀態服務器Session  (比網站進程內的Session慢一點。可是比佔用的內存比進程內的Seesion大一點。比數據庫Session快不少,可是畢竟是內存,因此也是容易被充爆的)tcp

2,數據庫Session  (磁盤讀寫比內存速度慢,須要頻繁打開ADO.NET的鏈接速度也慢,好處是空間無限大,因此比較穩定,推薦使用)post

狀態服務器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數據庫。咱們發現下面給咱們自動生成了兩個表

 

咱們在來配置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已經寫入到數據庫表中了。
相關文章
相關標籤/搜索