天天看點

ASP.NET Session詳解

當使用者在 Web 應用程式中導航 ASP.NET 頁時,ASP.NET 會話狀态使您能夠存儲和檢索使用者的值。HTTP 是一種無狀态協定。這意味着 Web 伺服器會将針對頁面的每個 HTTP 請求作為獨立的請求進行處理。伺服器不會保留以前的請求過程中所使用的變量值的任何資訊。

ASP.NET 會話狀态将來自限定時間範圍内的同一浏覽器的請求辨別為一個會話,當每個使用者首次與這台WWW伺服器建立連接配接時,他就與這個伺服器建立了一個Session,同時伺服器會自動為其配置設定一個SessionID,用以辨別這個使用者的唯一身份。Session提供用于在該會話持續期間内保留變量值的方法。預設情況下,将為所有 ASP.NET 應用程式啟用ASP.NET 會話狀态.

會話變量可以是任何有效的 .NET Framework 類型, 注意:當使用 InProc 以外的會話狀态模式時,會話變量類型必須為基元 .NET 類型或可序列化的類型。這是因為會話變量值存儲在外部資料存儲區中。

會話由一個唯一辨別符辨別,可使用 SessionID 屬性讀取此辨別符。為 ASP.NET 應用程式啟用會話狀态時,将檢查應用程式中每個頁面請求是否有浏覽器發送的 SessionID 值。如果未提供任何 SessionID 值,則 ASP.NET 将啟動一個新會話,并将該會話的 SessionID 值随響應一起發送到浏覽器。

預設情況下,SessionID 值存儲在 Cookie 中。但也可以将應用程式配置為在“無 Cookie”會話的 URL 中存儲 SessionID 值。隻要一直使用相同的 SessionID 值來發送請求,會話就被視為活動的。如果特定會話的請求間隔超過指定的逾時值(以分鐘為機關),則該會話被視為已過期。使用過期的 SessionID 值發送的請求将生成一個新的會話。

安全說明:

無論是作為 Cookie 還是作為 URL 的一部分,System.Web.SessionState.HttpSessionState.SessionID 值都以明文的形式發送。惡意使用者通過擷取 SessionID 值并将其包含在對伺服器的請求中,可以通路另一位使用者的會話。如果您将敏感資訊存儲在會話狀态中,建議使用 SSL 來加密浏覽器和伺服器之間包含 SessionID 值的任何通信。

預設情況下,SessionID 值存儲在浏覽器的不過期會話 Cookie 中。但是,通過在 Web.config 檔案的 sessionState 節中将 cookieless 屬性設定為 true,可以指定不應将會話辨別符存儲在 Cookie 中。

<configuration>

  <system.web>

    <sessionState cookieless="true"

      regenerateExpiredSessionId="true" />

  </system.web>

</configuration>

ASP.NET 通過自動在頁的 URL 中插入唯一的會話 ID 來保持無 Cookie 會話狀态。例如,下面的 URL 已被 ASP.NET 修改,以包含唯一的會話 ID lit3py55t21z5v55vlm25s55:

<a href="http://www.example.com/%28S%28lit3py55t21z5v55vlm25s55%29%29/orderform.aspx">http://www.example.com/(S(lit3py55t21z5v55vlm25s55))/orderform.aspx</a>

通過使用 system.web 配置節的 sessionState 元素可配置會話狀态。還可以通過使用 @ Page 指令中的 EnableSessionState 值來配置會話狀态。

使用 sessionState 元素可指定以下選項:

會話存儲資料所使用的模式。

在用戶端和伺服器間發送會話辨別符值的方式。

會話的 Timeout 值。

支援基于會話 Mode 設定的值。

下面的示例示範一個 sessionState 元素,該元素将配置應用程式的 SQLServer 會話模式。該元素将 Timeout 值設定為 30 分鐘,并指定将會話辨別符存儲在 URL 中。

ASP.NET Session詳解
ASP.NET Session詳解
&lt;sessionState mode="SQLServer"
ASP.NET Session詳解
  cookieless="true "
ASP.NET Session詳解
  regenerateExpiredSessionId="true "
ASP.NET Session詳解
  timeout="30"
ASP.NET Session詳解
  sqlConnectionString="Data Source=MySqlServer;Integrated Security=SSPI;"
ASP.NET Session詳解
  stateNetworkTimeout="30"/&gt;
ASP.NET Session詳解

可以通過将會話狀态模式設定為 Off 來禁用應用程式的會話狀态。如果隻希望禁用應用程式的某個特定頁的會話狀态,則可以将 @ Page 指令中的 EnableSessionState 值設定為 false。還可将 EnableSessionState 值設定為 ReadOnly 以提供對會話變量的隻讀通路。

注意:timeout是指會話的時間,機關是分鐘,也就是如果用戶端在timeout的時間内沒有向伺服器放送過請求,會話終止,所有的session資料将丢失。

ASP.NET 會話狀态支援若幹用于會話資料的存儲選項。每個選項都由 SessionStateMode 枚舉中的一個值辨別。下面的清單描述了可用的會話狀态模式:

InProc 模式,此模式将會話狀态存儲在 Web 伺服器上的記憶體中。這是預設設定。

StateServer 模式,此模式将會話狀态存儲在一個名為 ASP.NET 狀态服務的單獨程序中。這確定了在重新啟動 Web 應用程式時會保留會話狀态,并讓會話狀态可用于網絡場中的多個 Web 伺服器。

SQLServer 模式将會話狀态存儲到一個 SQL Server 資料庫中。這確定了在重新啟動 Web 應用程式時會保留會話狀态,并讓會話狀态可用于網絡場中的多個 Web 伺服器。

Custom 模式,此模式允許您指定自定義存儲提供程式。

Off 模式,此模式禁用會話狀态。

通過在應用程式的 Web.config 檔案中為 sessionState 元素的 mode 屬性配置設定一個 SessionStateMode 枚舉值,可以指定要讓 ASP.NET 會話狀态使用的模式。除了 InProc 和 Off 之外,其他模式都需要附加參數,例如将在本主題後面讨論的連接配接字元串值。通過通路 HttpSessionStateMode 屬性的值,可以檢視目前標明的會話狀态。

1. Login.aspx

ASP.NET Session詳解
ASP.NET Session詳解
ASP.NET Session詳解

&lt;%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %&gt;

ASP.NET Session詳解

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;

ASP.NET Session詳解

&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;

ASP.NET Session詳解

&lt;head runat="server"&gt;

ASP.NET Session詳解

    &lt;title&gt;Untitled Page&lt;/title&gt;

ASP.NET Session詳解

&lt;/head&gt;

ASP.NET Session詳解

&lt;body&gt;

ASP.NET Session詳解

    &lt;form id="form1" runat="server"&gt;

ASP.NET Session詳解

    &lt;div&gt;

ASP.NET Session詳解

        &lt;asp:Button ID="mLoginButton" runat="server" Text="Login" 

ASP.NET Session詳解

            onclick="mLoginButton_Click" /&gt;

ASP.NET Session詳解

    &lt;/div&gt;

ASP.NET Session詳解

    &lt;/form&gt;

ASP.NET Session詳解

&lt;/body&gt;

ASP.NET Session詳解

&lt;/html&gt;

ASP.NET Session詳解
ASP.NET Session詳解

Login.aspx.cs

public partial class Login : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

    }

    protected void mLoginButton_Click(object sender, EventArgs e)

        Session["loginName"] = "Jack Wang" + DateTime.Now.ToString();

        Response.Redirect("Default.aspx");

}

2. Default.aspx頁 

ASP.NET Session詳解
ASP.NET Session詳解

&lt;%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %&gt;

ASP.NET Session詳解

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "

http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;

ASP.NET Session詳解
ASP.NET Session詳解
ASP.NET Session詳解
ASP.NET Session詳解

    &lt;title&gt;Session Sample&lt;/title&gt;

ASP.NET Session詳解
ASP.NET Session詳解
ASP.NET Session詳解
ASP.NET Session詳解

    &lt;div&gt;   

ASP.NET Session詳解

        &lt;asp:Button ID="mGetSessionButton" runat="server" Text="Get Session"

ASP.NET Session詳解

            onclick="mGetSessionButton_Click"   /&gt;

ASP.NET Session詳解

        &lt;asp:Label ID="mShowSessionContentLabel" runat="server"&gt;&lt;/asp:Label&gt;   

ASP.NET Session詳解
ASP.NET Session詳解
ASP.NET Session詳解
ASP.NET Session詳解

&lt;/html&gt; 

ASP.NET Session詳解

Default.aspx.cs

public partial class _Default : System.Web.UI.Page

        //Response.AddHeader("Refresh", (Session.Timeout*1000).ToString() + ";URL=Login.aspx");

        if (string.IsNullOrEmpty(Session["loginName"] as string))

        {

            Response.Redirect("Login.aspx");

        }

    protected void mGetSessionButton_Click(object sender, EventArgs e)

        mShowSessionContentLabel.Text = "&lt;br&gt; Now is:" + DateTime.Now.ToString() + "&lt;br&gt;Session Content:" +

            Session["loginName"] as string + "&lt;br&gt;SessionId:" + Session.SessionID.ToString()

            +"&lt;br&gt;session start time:"+ Session["startTime"] as string;

3. 示例不同的模式,配置web.config

&lt;sessionState mode="InProc" timeout="2"&gt;&lt;/sessionState&gt;        

          (1) 測試頁面 ,過兩分鐘後再點選Get Session将傳回到Login.aspx頁,因為session過期

ASP.NET Session詳解
(2)重新開機web服務,點選Get Session将傳回到Login.aspx頁,因為session丢失
注意:如果模式設定為 StateServer,則存儲在會話狀态中的對象必須是可序列化的。 (1)啟動ASP.NET State Service服務
ASP.NET Session詳解
(2)修改SessionState為如下 &lt;sessionState  mode="StateServer" timeout="10" stateConnectionString="tcpip=127.0.0.1:42424"&gt;    &lt;/sessionState&gt; (3)重新開機web伺服器,點選GetSession,session 10分鐘内不會丢失,因為session存儲伺服器的另一個aspnet_state的程序裡
ASP.NET Session詳解
描述: 如果是 SQL Server 模式,則存儲在會話狀态中的對象必須是可序列化的 預設情況下,Aspnet_regsql.exe 工具将建立一個名為 ASPState 的資料庫,該資料庫包含支援 SQLServer 模式的存儲過程。預設情況下,會話資料本身存儲在 tempdb 資料庫中。您可以選擇使用 -sstype 選項來更改會話資料的存儲位置。下表給出了 -sstype 選項可能的值: t :将會話資料存儲到 SQL Server tempdb 資料庫中。這是預設設定。如果将會話資料存儲到 tempdb 資料庫中,重新啟動 SQL Server 時将丢失會話資料。 p:将會話資料存儲到 ASPState 資料庫中,而不是存儲到 tempdb 資料庫中。 c :将會話資料存儲到自定義資料庫中。如果指定 c 選項,則還必須使用 -d 選項包括自定義資料庫的名稱。   (1) 進入visual studio 2008(2005) command prompt (2) 輸入如下紅色的指令
ASP.NET Session詳解
(3) 建立出如下資料庫和表
ASP.NET Session詳解
(4) 運作頁面,然後重新開機web服務,點選Get Session,session不會丢失,因為session儲存到sql server資料庫裡了。
ASP.NET Session詳解
ASP.NET Session詳解

 本文轉自靈活的水部落格園部落格,原文連結http://www.cnblogs.com/cnblogsfans/archive/2008/07/01/1233255.html如需轉載請自行聯系原作者

王德水