ASP.NET狀態管理之九(會話Session)

來源:互聯網
上載者:User

ASP.NET 允許您使用工作階段狀態儲存每個活動的 Web 應用程式會話的值,工作階段狀態是 HttpSessionState 類的一個執行個體。

工作階段狀態與應用程式狀態相似,不同的只是工作階段狀態的範圍限於當前的瀏覽器會話。如果有不同的使用者在使用您的應用程式,則每個使用者會話都將有一個不同的工作階段狀態。此外,如果同一使用者在退出後又返回到應用程式,第二個使用者會話的工作階段狀態也會與第一個不同。

工作階段狀態採用鍵/值字典形式的結構來儲存特定於會話的資訊,這些資訊需要在伺服器往返行程之間及頁請求之間進行維護。

可以使用工作階段狀態來完成以下任務:
1.唯一標識瀏覽器或用戶端裝置請求,並將這些請求映射到伺服器上的單獨會話執行個體。
2.在伺服器上儲存特定於會話的資料,以用於同一個會話內的多個瀏覽器或用戶端裝置請求。
3.引發適當的會話管理事件。此外,可以利用這些事件編寫應用程式代碼。

一旦將應用程式特定的資訊添加到工作階段狀態中,伺服器就會管理該對象。根據您指定的選項的不同,可以將會話資訊儲存在 Cookie 中、進程外伺服器中或運行 Microsoft SQL Server 的電腦中。

預設情況下,所有 ASP.NET 應用程式都啟用 ASP.NET 工作階段狀態。

 

會話變數
如何:儲存工作階段狀態中的值
會話變數儲存在通過 System.Web.HttpContext.Session 屬性公開的 SessionStateItemCollection 中。
會話變數集合按變數名稱或整數索引來進行索引。僅需通過名稱引用會話變數即可建立會話變數。無需聲明會話變數或將會話變數顯式添加到集合中。
例如,下面的程式碼範例建立分別表示使用者的名字和姓氏的會話變數,並將它們設定為從 TextBox 控制項檢索到的值。
Session["FirstName"] = FirstNameTextBox.Text;
Session["LastName"] = LastNameTextBox.Text;

預設情況下,會話變數可以為任何有效 .NET 類型。
例如,下面的程式碼範例將值的 ArrayList 儲存在名為“StockPicks”的會話變數中。注意,由“StockPicks”會話變數返回的值在從 SessionStateItemCollection 檢索出來時必須強制轉換為適當的類型。
ArrayList stockPicks = (ArrayList)Session["StockPicks"];

Session["StockPicks"] = stockPicks;

如何:讀取工作階段狀態中的值
此樣本訪問 Item 屬性來檢索工作階段狀態中的值。
string firstName = (string)(Session["First"]);
string lastName = (string)(Session["Last"]);
string city = (string)(Session["City"]);

如果嘗試從不存在的工作階段狀態中擷取值,則不會引發任何異常。若要確保所需的值在工作階段狀態中,請首先使用測試(例如以下測試)檢查該對象是否存在:
if (Session["City"] == null)
    // No such value in session state; take appropriate action.

 

工作階段識別項
瀏覽器的會話使用儲存在 SessionID 屬性中的唯一識別碼進行標識。會話 ID 使 ASP.NET 應用程式能夠將特定的瀏覽器與 Web 服務器上相關的會話資料和資訊相關聯。會話 ID 的值在瀏覽器和 Web 服務器間通過 Cookie 進行傳輸,如果指定了無 Cookie 會話,則通過 URL 進行傳輸。

無 Cookie SessionID
預設情況下,SessionID 儲存在瀏覽器未到期會話的 Cookie 中。通過在 Web.config 檔案的 sessionState 節中將 cookieless 屬性設定為 TRUE,可以指定不將工作階段識別項儲存在 Cookie 中。
ASP.NET 通過自動在頁的 URL 中插入唯一的會話 ID 來保持無 Cookie 工作階段狀態。
例如,下面的 URL 已被 ASP.NET 修改,以包含唯一的會話 ID lit3py55t21z5v55vlm25s55:
http://www.example.com/s(lit3py55t21z5v55vlm25s55)/orderform.aspx

ASP.NET 修改所有請求頁中包含的使用相對於應用程式的路徑的連結(不修改顯式路徑),方法是在將每頁發送到瀏覽器之前,在連結中嵌入一個會話 ID 值。只要使用者遵循 ASP.NET 應用程式提供的連結路徑,即可保持工作階段狀態。但是,如果用戶端重寫了應用程式提供的 URL,ASP.NET 將不能解析此會話 ID,也不能將此請求與現有的會話相關聯,因此會為此請求啟動一個新的會話。

會話 ID 嵌入在 URL 中應用程式名稱後的斜杠之後,在其餘所有檔案或虛擬目錄標識符之前。

 

工作階段狀態事件
ASP.NET 提供了兩種協助您系統管理使用者會話的事件:Session_OnStart 事件和 Session_OnEnd 事件;前者在新會話開始時引發,後者在會話被放棄或到期時引發。

Session_OnStart 事件
可以通過向 Global.asax 檔案添加一個名為 Session_OnStart 的子常式來處理 Session_OnStart 事件。如果請求開始一個新會話,Session_OnStart 子常式會在請求開始時運行。如果請求不包含 SessionID 值或請求所包含的 SessionID 屬性引用一個已到期的會話,則會開始一個新會話。
您可以使用 Session_OnStart 事件初始化會話變數並跟蹤與會話相關的資訊。

Session_OnEnd 事件
可以通過向 Global.asax 檔案添加一個名為 Session_OnEnd 的子常式來處理 Session_OnEnd 事件。Session_OnEnd 子常式在 Abandon 方法已被調用或會話已到期時運行。如果超過了某一會話 Timeout 屬性指定的分鐘數並且在此期間內沒有請求該會話,則該會話到期。
只有工作階段狀態屬性 Mode 設定為 InProc(預設值)時,才支援 Session_OnEnd 事件。如果工作階段狀態屬性 Mode 為 StateServer 或 SQLServer,則忽略 Global.asax 檔案中的 Session_OnEnd 事件。如果工作階段狀態屬性 Mode 設定為 Custom,則由自訂工作階段狀態儲存提供者決定是否支援 Session_OnEnd 事件。
您可以使用 Session_OnEnd 事件清除與會話相關的資訊,如由 SessionID 值跟蹤的資料來源中的使用者資訊。

下面的程式碼範例示範一個可以添加到 Global.asax 檔案的 Session_OnStart 和 Session_OnEnd 子常式樣本。在此樣本中定義的這些子常式建立一個計數器,用來跟蹤正在使用應用程式的應用程式使用者的數量。請注意,只有工作階段狀態屬性 Mode 設定為 InProc 時,此樣本才會正常運行,因為只有進程內工作階段狀態儲存才支援 Session_OnEnd 事件。
<script language="C#" runat="server">
public void Application_OnStart()
{
  Application["UsersOnline"] = 0;
}

public void Session_OnStart()
{
  Application.Lock();
  Application["UsersOnline"] = (int)Application["UsersOnline"] + 1;
  Application.UnLock();
}

public void Session_OnEnd()
{
  Application.Lock();
  Application["UsersOnline"] = (int)Application["UsersOnline"] - 1;
  Application.UnLock();
}
</script>

 

工作階段狀態模式
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 之外,其他模式都需要附加參數,例如將在本主題後面討論的連接字串值。通過訪問 System.Web.SessionState.HttpSessionState.Mode 屬性的值,可以查看當前選定的工作階段狀態。

進程內模式
進程內模式是預設的工作階段狀態模式,使用 InProcSessionStateMode 枚舉值指定。進程內模式將工作階段狀態值和變數儲存在本地 Web 服務器上的記憶體中。它是唯一支援 Session_OnEnd 事件的模式。

狀態伺服器模式
StateServer 模式將工作階段狀態儲存在一個稱為 ASP.NET 狀態服務的進程中,該進程是獨立於 ASP.NET 輔助進程或 IIS 應用程式集區的單獨進程。使用此模式可以確保在重新啟動 Web 應用程式時保留工作階段狀態,並使工作階段狀態可用於網路場中的多個 Web 服務器。

SQL Server 模式
SQLServer 模式將工作階段狀態儲存到一個 SQL Server 資料庫中。使用此模式可以確保在重新啟動 Web 應用程式時保留工作階段狀態,並使工作階段狀態可用於網路場中的多個 Web 服務器。

自訂模式
Custom 模式指定您希望使用自訂工作階段狀態儲存提供者來儲存工作階段狀態資料。在使用 Custom 的 Mode 配置 ASP.NET 應用程式時,必須使用 sessionState 配置元素的 providers 子項目指定工作階段狀態儲存提供者的類型。使用 add 子項目來指定提供者類型,並包括指定提供者類型名稱的 type 屬性以及指定提供者執行個體名稱的 name 屬性。然後,將提供者執行個體的名稱提供給 sessionState 元素的 customProvider 屬性,將 ASP.NET 工作階段狀態配置為使用該提供者執行個體來儲存和檢索會話資料。

 

配置工作階段狀態
使用 system.web 配置節的 sessionState 元素來配置工作階段狀態。還可以使用 EnableSessionState 頁指令來配置工作階段狀態。

使用 sessionState 元素可以指定會話儲存資料的模式、在用戶端和伺服器間發送工作階段識別項值的方式、會話 Timeout 值和基於會話 Mode 的支援值。例如,下面的 sessionState 元素將應用程式配置為 SQLServer 會話模式,Timeout 為 30 分鐘,並指定將工作階段識別項儲存在 URL 中。

<sessionState mode="SQLServer"
  cookieless="true "
  regenerateExpiredSessionId="true "
  timeout="30"
  sqlConnectionString="Data Source=MySqlServer;Integrated Security=SSPI;"
  stateNetworkTimeout="30"/>

可以通過將工作階段狀態模式設定為 Off 來禁用應用程式的工作階段狀態。如果只希望禁用應用程式的某個特定頁的工作階段狀態,則可以將 EnableSessionState 頁指令設定為 false。注意,還可將 EnableSessionState 頁指令設定為 ReadOnly 以提供對會話變數的唯讀訪問。

 

並發請求和工作階段狀態
對 ASP.NET 工作階段狀態的訪問專屬於每個會話,這意味著如果兩個不同的使用者同時發送請求,則會同時授予對每個單獨會話的訪問。但是,如果這兩個並發請求是針對同一會話的(即,使用相同的 SessionID 值),則接收到的第一個請求獲得對會話資訊的獨佔訪問權,而第二個請求將在第一個請求完成之後執行,或直到由於第一個請求超過鎖定逾時時間而釋放對該資訊的獨佔鎖定後再執行。如果將 EnableSessionState 頁指令設定為 ReadOnly,則對唯讀會話資訊的請求不會導致對會話資料的獨佔鎖定。可能仍需等到會話資料由讀寫請求而獲得的鎖定被解除後,對會話資料的唯讀請求才能得到滿足。

 

 

 

http://aierong.cnblogs.com
Sql Server2005 Transact-SQL 新兵器學習總結之-總結
MS SQLDatabase Backup和恢複預存程序(加強版本)
sql server中分散式查詢隨筆(連結的伺服器(sp_addlinkedserver)和遠程登入映射(sp_addlinkedsrvlogin)使用小總結)
WAP開發資料站(最新更新)
自訂格式字串隨筆 (IFormattable,IFormatProvider,ICustomFormatter三介面的實現)
Mcad學習筆記之非同步編程(AsyncCallback 委託,IAsyncResult介面,BeginInvoke方法,EndInvoke方法的使用小總結)
Mcad學習筆記之通過反射調用類的方法,屬性,欄位,索引器(2種方法)
Mcad學習筆記之序列化(2進位和Soap序列化)
Mcad學習筆記之委託再理解(delegate的構造器,BeginInvoke,EndInvoke,Invoke4個方法的探討)
WinForm開發,表單顯示和表單傳值相關知識總結
Mcad學習筆記之Microsoft Windows服務
copy某目錄下的所有的目錄和檔案到目的目錄(目錄數據備份)
ASP.NET狀態管理之一(概括篇)

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.