程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 在ASP.NET中實現會話狀態基礎

在ASP.NET中實現會話狀態基礎

編輯:關於ASP.NET

簡介

在 Web 應用程序這樣的無狀態環境中,了解會話狀態的概念並沒有實際的意義。盡管如此,有效的狀態管理對於大多數 Web 應用程序來說都是一個必備的功能。Microsoft ASP.NET 以及許多其他服務器端編程環境都提供了一個抽象層,允許應用程序基於每個用戶和每個應用程序存儲持久性數據。

需要特別注意的是,Web 應用程序的會話狀態是應用程序在不同的請求中緩存和檢索的數據。會話表示用戶在與該站點連接期間發送的所有請求,會話狀態是用戶在會話期間生成和使用的持久性數據的集合。每個會話的狀態都彼此獨立,而且在用戶會話結束時就不復存在了。

會話狀態與構成 HTTP 協議和規范的任何邏輯實體都沒有對應關系。會話是由服務器端開發環境(例如傳統的 ASP 和 ASP.NET)構建的抽象層。ASP.NET 展示會話狀態的方式以及會話狀態的內部實現方式都取決於平台的基礎結構。因此,傳統的 ASP 和 ASP.NET 以完全不同的方式來實現會話狀態,預計在下一版的 ASP.NET 中會有進一步的改進和增強。

本文討論如何在 ASP.NET 1.1 中實現會話狀態,以及如何在被管理的 Web 應用程序中優化會話狀態管理。

ASP.NET 會話狀態概述

會話狀態並不是 HTTP 基礎結構的一部分。也就是說,應該有一個結構組件將會話狀態與每個傳入請求綁定在一起。運行時環境(傳統的 ASP 或 ASP.NET)能夠接受 Session 之類的關鍵字,並使用它指示服務器上存儲的數據塊。要成功解析 Session 對象的調用,運行時環境必須將會話狀態添加到正在處理的請求的調用上下文中。完成此操作的方式因平台而異,但它是有狀態 Web 應用程序的基礎操作。

在傳統的 ASP 中,會話狀態是作為 asp.dll 庫中包含自由線程 COM 對象來實現的。(您對此很好奇嗎?其實該對象的 CLSID 是 D97A6DA0-A865-11cf-83AF-00A0C90C2BD8。)此對象存儲以名稱/值對集合的方式組織的數據。“名稱”占位符表示用來檢索信息的關鍵字,而“值”占位符表示會話狀態中存儲的內容。名稱/值對按照會話 ID 進行分組,這樣,每個用戶看到的只是他/她自己創建的名稱/值對。

在 ASP.NET 中,會話狀態的編程接口與傳統的 ASP 幾乎是相同的。但它們的基礎實現是完全不同的,前者比後者更具有靈活性、可擴展性和更強的編程功能。深入研究 ASP.NET 會話狀態之前,讓我們簡單回顧一下 ASP.NET 會話基礎結構的某些結構功能。

在 ASP.NET 中,任何傳入 HTTP 請求都要通過 HTTP 模塊管道進行傳輸。每個模塊都可以篩選並修改請求所攜帶的大量信息。與每個請求關聯的信息叫做“調用上下文”,編程中用 HttpContext 對象來表示。我們不應將請求的上下文視為狀態信息的另一個容器,雖然它提供的 Items 集合只是一個數據容器。HttpContext 對象不同於所有其他狀態對象(例如,Session、Application 和 Cache),因為它的有限生命周期超出了處理請求所需的時間。當請求通過一系列注冊的 HTTP 模塊後,其 HttpContext 對象將包含狀態對象的引用。當最終可以處理請求時,關聯的調用上下文將綁定到特定會話 (Session) 和全局狀態對象(Application 和 Cache)。

負責設置每個用戶的會話狀態的 HTTP 模塊為 SessionStateModule。該模塊的結構是根據 IHttpModule 接口設計的,它為 ASP.NET 應用程序提供大量與會話狀態有關的服務。包括生成會話 ID、Cookieless 會話管理、從外部狀態提供程序中檢索會話數據以及將數據綁定到請求的調用上下文。

HTTP 模塊並不在內部存儲會話數據。會話狀態始終保存在名為“狀態提供程序”的外部組件中。狀態提供程序完全封裝會話狀態數據,並通過 IStateClientManager 接口的方法與其他部分進行通信。會話狀態 HTTP 模塊調用該接口上的方法來讀取並保存會話狀態。ASP.NET 1.1 支持三種不同的狀態提供程序,如表 1 所示。

表 1:狀態客戶端提供程序

提供程序 說明 InProc 會話值在 ASP.NET 輔助進程(Microsoft? Windows Server? 2003 中的 aspnet_wp.exe 或 w3wp.exe)的內存中保持為活動對象。這是默認選項。 StateServer 會話值被序列化並存儲在單獨進程 (aspnet_state.exe) 的內存中。該進程還可以在其他計算機上運行。 SQLServer 會話值被序列化並存儲在 Microsoft? SQL Server? 表中。SQL Server 的實例可以在本地運行,也可以遠程運行。

會話狀態 HTTP 模塊將從 web.config 文件的 <sessionState>; 部分讀取當前選定的狀態提供程序。

<sessionState mode="InProc | StateServer | SQLServer />;

根據 mode 特性的值,將通過不同的步驟從不同的進程中檢索會話狀態並將其存儲到不同的進程中。默認情況下,會話狀態存儲在本地的 ASP.NET 輔助進程中。特殊情況下,會將其存儲在 ASP.NET Cache 對象的專用槽中(不能通過編程方式訪問)。也可以將會話狀態存儲在外部,甚至是遠程進程中(例如,名為 aspnet_state.exe 的 Windows NT 服務中)。第三個選項是將會話狀態存儲到由 SQL Server 2000 管理的專用數據庫表中。

HTTP 模塊會在請求的一開始對會話值進行反序列化,使它們成為詞典對象。然後,將采用編程方式通過類(例如,HttpContext 和 Page)顯示的屬性 Session 來訪問詞典(實際上是 HttpSessionState 類型的對象)。會話狀態值與開發人員可見的會話對象之間的綁定將持續到請求結束。如果請求成功完成,所有狀態值將被序列化回狀態提供程序,並可用於其他請求。

圖 1 說明了請求的 ASP.NET 頁面與會話值之間的通信。每個頁面所使用的代碼都與 page 類上的 Session 屬性有聯系。其編程方式與傳統的 ASP 幾乎相同。

圖 1:ASP.NET 1.1 中的會話狀態體系結構

在完成請求所需的時間內,會話狀態的物理值處於鎖定狀態。該鎖定由 HTTP 模塊在內部管理並用於同步對會話狀態的訪問。

會話狀態模塊實例化應用程序的狀態提供程序,並使用從 web.config 文件中讀取的信息對其進行初始化。接下來,每個提供程序將繼續自己的初始化操作。提供程序的類型不同,其初始化操作會大不相同。例如,SQL Server 狀態管理器將打開與給定數據庫的連接,而進程外管理器將檢查指定的 TCP 端口。另一方面,InProc 狀態管理器將存儲對回調函數的引用。從緩存中刪除元素時將執行此操作,並用於觸發應用程序的 Session_OnEnd 事件。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved