ASP.NET会话状态管理详解

在ASP.NET中,会话状态(Session)是一种服务器端的状态管理机制,它允许开发者在用户与服务器的交互过程中保存和检索用户特定的数据。会话状态是安全的,对用户透明,并且可以存储任何类型的对象。然而,在高流量的网站中,由于会话状态存储在服务器内存中,可能会导致性能问题。

存储和检索会话状态的值非常简单。以下是在VB.NET和C#中存储和检索会话状态的示例:

VB.NET

Session("Name") = "John Doe" ' 或者 Session.Add("Name", "John Doe")

C#

Session["Name"] = "John Doe"; // 或者 Session.Add("Name", "John Doe");

默认情况下,会话状态是在网站运行的同一进程中创建的(InProc)。这可以通过web.config文件中的设置来控制:

<sessionState mode="InProc" />

虽然在进程中运行会话状态非常方便,但这也意味着每当应用程序重新启动(例如部署更新时)时,所有会话值都会丢失。有其他模式可以使用,即使在应用程序重新启动时,也会话状态能够存活。可用的选项包括:

  • Off - 不存储会话状态
  • InProc - (默认)会话状态存在于Web使用的进程中
  • StateServer - 会话数据发送到配置的状态服务器服务
  • SQLServer - 会话数据存储在配置的SQL Server数据库中

StateServer模式和SQLServer模式都允许会话状态在应用程序重新启动后存活。但是,当存储引用类型对象(如类实例)时,它们只能存储到StateServer或SQLServer,前提是它们已经被标记为[Serializable]属性。

在Global.asax文件中,有一些与会话状态相关的事件,如Session_Start和Session_End。Session_End事件只在InProc中触发,它不支持OutProc实现的会话管理。

使用会话状态的一个重要考虑是会话会过期。默认情况下,如果用户在20分钟内(默认)没有访问他们的会话数据,会话将过期,会话中存储的所有项将被丢弃。因此,在尝试使用它之前,检查从会话返回的对象是否存在或是否为null非常重要。例如:

object sessionObject = Session["someObject"]; if (sessionObject != null) { myLabel.Text = sessionObject.ToString(); }

会话超时可以通过web.config设置进行调整,但增加超时值可能会对服务器内存造成压力,这可能是不可取的:

<sessionState timeout="number of minutes" />
  • Session.Abandon() - 删除会话及其包含的所有项
  • Session.Clear() - 从会话中删除所有项
  • Session.RemoveAll() - 从会话中删除所有项
  • Session.Remove("itemName") - 删除存储在"itemName"下的对象

ASP.NET会话状态管理资源

  • ASP.NET会话状态概述 - 从这篇优秀的MSDN文档开始
  • 在ASP.NET中使用会话和应用程序对象
  • 选择维护和存储ASP.NET会话状态的方法
  • 驯服无状态野兽:在Web农场中管理会话状态
  • ASP.NET会话状态常见问题解答 - 来自Peter Bromberg的快速总结,包括不同会话状态模式的列表以及从多个来源汇编的常见问题解答,包括他自己的“发现”
  • 如何在故障转移群集中使用ASP.NET会话状态SQL Server模式 - 本文描述了必须拥有的信息,以配置Web服务器群集使用在故障转移群集中运行的SQL会话状态。
  • 状态管理 - 博客概述了存储状态的决策过程、优势和劣势。
  • ASP.NET的状态管理 - 一篇很好的基础白皮书,列举了管理状态的各种选择。
  • KB:ASP.NET状态管理概述 - 一篇干燥但相当全面的KB文章,关于会话状态。
  • Microsoft ASP.NET 2.0提供程序:介绍和会话状态提供程序 - “会话状态提供程序提供了Microsoft ASP.NET会话状态模块和会话状态数据源之间的接口。”如果计划编写自己的提供程序,或者只是想理解现有的提供程序之一,MSDN文档是一个很好的起点。
  • 快速、可扩展且安全的Web应用程序会话状态管理 - 来自MSDN杂志的一篇优秀文章,介绍了ASP.NET会话状态架构。
  • 架构和性能考虑 - 一篇非常周到的博客文章,可以帮助决定使用哪个会话提供程序。
  • 探索ASP.NET中的会话 - Code Project:本文描述了ASP.NET 2.0中的会话。不同类型的会话,它们的配置。还描述了Web农场、负载均衡器、Web Garden等中的会话。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485