当用户在构成 Web 应用程序的不同 ASP.NET 页面之间导航时,ASP.NET 会话状态使您能够为用户存储和检索值。HTTP 是一种无状态协议,这意味着您的 Web 服务器将对页面的每个 HTTP 请求当作独立的请求进行处理;服务器不保留与先前请求所使用的任何变量值有关的信息。ASP.NET 会话状态将一个有限时间窗口内来自同一浏览器的请求标识为一个会话,并在该会话持续期间保留变量的值。
默认情况下,所有 ASP.NET 应用程序都启用 ASP.NET 会话状态。
会话状态的替代选项包括应用程序状态(请参见 Application 属性),它存储 ASP.NET 应用程序的所有用户均可访问的变量;System.Web.Profile 命名空间,它将用户值持久保留在数据存储区中,不使用超时限制让其过期;System.Web.Caching 命名空间,它将常用值存储在所有 ASP.NET 应用程序均可访问的内存中;ASP.NET System.Web.UI.WebControls,它将控件值持久保留在 ViewState 中;Cookies;QueryString;以及可使用 Form 集合通过 HTTP POST 访问的 HTML 表单中的字段。有关不同状态管理选项的比较,请参见 ASP.NET 状态管理建议。
会话变量
会话变量存储在通过 System.Web.HttpContext.Session 属性公开的 SessionStateItemCollection 中。会话变量集合按变量名称或整数索引来进行索引。仅需通过名称引用会话变量即可创建会话变量。无需声明会话变量或将会话变量显式添加到集合中。例如,下面的代码示例创建分别表示用户的名字和姓氏的会话变量,并将它们设置为从 TextBox 控件检索到的值。
Session("FirstName") = FirstNameTextBox.Text Session("LastName") = LastNameTextBox.Text
Session["FirstName"] = FirstNameTextBox.Text; Session["LastName"] = LastNameTextBox.Text;
默认情况下,会话变量可以为任何有效的 .NET 类型。例如,下面的代码示例将值的 ArrayList 存储在名为“StockPicks”的会话变量中。注意,由“StockPicks”会话变量返回的值在从 SessionStateItemCollection 检索出来时必须强制转换为适当的类型。
' When retrieving an object from session state, cast it as ' the appropriate type. Dim stockPicks As ArrayList = CType(Session("StockPicks"), ArrayList) ' Write the modified stock picks list back to session state. Session("StockPicks") = stockPicks
// When retrieving an object from session state, cast it as // the appropriate type. ArrayList stockPicks = (ArrayList)Session["StockPicks"]; // Write the modified stock picks list back to session state. Session["StockPicks"] = stockPicks;
会话标识符
会话由一个可以使用 SessionID 属性读取的唯一会话标识符标识。为 ASP.NET 应用程序启用会话状态时,将检查应用程序中每个页面请求是否有浏览器发送的 SessionID 值。如果未提供任何 SessionID 值,则 ASP.NET 启动一个新会话,然后将该会话的 SessionID 随响应一起发送到浏览器。
默认情况下,SessionID 值存储在 cookie 中,但也可以配置应用程序,将 SessionID 值存储在 URL 中,以实现一个“无 cookie”的会话。有关更多信息,请参见会话标识符。
只要一直使用相同的 SessionID 值来发送请求,会话就被视为活动的。如果特定会话的请求发送间隔超过指定的超时值(以分钟为单位),则该会话被视为已过期。使用过期的 SessionID 值来发送请求将导致启动一个新会话。
会话事件
ASP.NET 提供两个有助于管理用户会话的事件:Session_OnStart 事件(在开始一个新会话时引发)和 Session_OnEnd 事件(在会话被放弃或过期时引发)。会话事件是在 ASP.NET 应用程序的 Global.asax 文件中指定的。注意,如果将会话 Mode 设置为 InProc(默认模式)以外的值,则 Session_OnEnd 事件将不受支持。
![]() |
---|
如果 ASP.NET 应用程序的 Global.asax 文件或 Web.config 文件被修改,将重新启动应用程序,而且存储在应用程序状态或会话状态中的所有值都将丢失。注意,某些防病毒软件可能会更新应用程序的 Global.asax 或 Web.config 文件的最后修改日期和时间。 |
有关更多信息,请参见会话状态事件。
会话模式
ASP.NET 会话状态支持会话变量的若干不同的存储选项。每个选项都被标识为一个会话状态 Mode。默认行为是将会话变量存储在 ASP.NET 辅助进程的内存空间中。但是,也可以指定将会话状态存储在单独进程、SQL Server 数据库或自定义数据源中。如果不希望为应用程序启用会话状态,可以将会话模式设置为 Off。
有关更多信息,请参见会话状态模式。
配置会话状态
使用 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,则对只读会话信息的请求不会导致对会话数据的独占锁定。可能仍需等到会话数据由读写请求而获得的锁定被解除后,对会话数据的只读请求才能得到满足。