.net Session 詳解

ForTechnology發表於2011-12-01
(一) 描述
當使用者在 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 中。

 
          regenerateExpiredSessionId="true" />
 


ASP.NET 通過自動在頁的 URL 中插入唯一的會話 ID 來保持無 Cookie 會話狀態。例如,下面的 URL 已被 ASP.NET 修改,以包含唯一的會話 ID lit3py55t21z5v55vlm25s55:
http://www.example.com/(S(lit3py55t21z5v55vlm25s55))/orderform.aspx
(二)配置會話狀態
通過使用 system.web 配置節的 sessionState 元素可配置會話狀態。還可以通過使用 @ Page 指令中的 EnableSessionState 值來配置會話狀態。
使用 sessionState 元素可指定以下選項:
•    會話儲存資料所使用的模式。
•    在客戶端和伺服器間傳送會話識別符號值的方式。
•    會話的 Timeout 值。
•    支援基於會話 Mode 設定的值。
下面的示例演示一個 sessionState 元素,該元素將配置應用程式的 SQLServer 會話模式。該元素將 Timeout 值設定為 30 分鐘,並指定將會話識別符號儲存在 URL 中。
    cookieless="true "
   regenerateExpiredSessionId="true "
   timeout="30"
   sqlConnectionString="Data Source=MySqlServer;Integrated Security=SSPI;"
   stateNetworkTimeout="30"/>
可以通過將會話狀態模式設定為 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

 
 br>"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
 
     Untitled Page
 
 
    
    

        

    
 
 

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頁
 
 
 
 
 
     Session Sample
 
 
    
    
  
        

    
 
 
Default.aspx.cs
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //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 = "
Now is:" + DateTime.Now.ToString() + "
Session Content:" +
            Session["loginName"] as string + "
SessionId:" + Session.SessionID.ToString()
            +"
session start time:"+ Session["startTime"] as string;
    }
 
3. 示例不同的模式,配置web.config
a. InProc模式
        
          (1) 測試頁面 ,過兩分鐘後再點選Get Session將返回到Login.aspx頁,因為session過期

(2)重啟web服務,點選Get Session將返回到Login.aspx頁,因為session丟失
b. StateServer模式
注意:如果模式設定為 StateServer,則儲存在會話狀態中的物件必須是可序列化的。
(1)啟動ASP.NET State Service服務
(2)修改SessionState為如下
   

(3)重啟web伺服器,點選GetSession,session 10分鐘內不會丟失,因為session儲存伺服器的另一個aspnet_state的程式裡

c. sql server模式
描述:
如果是 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) 輸入如下紅色的命令

(3) 建立出如下資料庫和表

(4) 執行頁面,然後重啟web服務,點選Get Session,session不會丟失,因為session儲存到sql server資料庫裡了。
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25897606/viewspace-712500/,如需轉載,請註明出處,否則將追究法律責任。

相關文章