Session





3.00/5 (2投票s)
ASP.NET Session 状态提供了一个存储跨页面请求持久化值的空间。存储在 Session 中的值存储在服务器上
ASP.NET Session 状态提供了一个存储跨页面请求持久化值的空间。存储在 Session 中的值存储在服务器上,直到它们被显式移除或 Session 过期为止,它们会一直保留在内存中。
使用 Session 进行状态管理是 ASP.NET 最好的功能之一,因为它安全、对用户透明,并且我们可以将任何类型的对象存储其中。尽管有这些优点,但有时 Session 会在高流量网站上引起性能问题,因为它存储在服务器内存中,客户端从服务器读取数据。
在 Session
中存储和检索值非常简单,就像
VB
'Storing Name in Session Session("Name") = "John Doe" 'Or Session.Add("Name","John Doe") 'retrieving string Dim Name As String = Session("Name")
C#
//Storing Name in Session Session["Name"] = "John Doe" // Or Session.Add("Name","John Doe"); //retrieving string Name = (string)Session["Name"];
默认情况下,Session 将在您的网站运行的同一个进程中创建(InProc
)。这由 web.config 文件中的一个设置控制。
<sessionState mode="InProc" />
尽管在进程内运行 Session 非常方便,但这也意味着每当应用程序回收(例如在部署更新时)时,所有 Session 值都会丢失。您可以使用其他模式,这些模式允许 Session 状态在应用程序回收后仍然保留。可用的选项是:
Off
- 不存储任何 Session 状态InProc
-(默认)Session 状态存在于 Web 使用的进程中StateServer
- Session 数据被发送到配置的状态服务器服务SQLServer
- Session 数据存储在配置的 SQL Server 数据库中
StateServer
模式和 SQLServer
模式都允许 Session 状态在应用程序回收后仍然保留。但是,在存储引用类型对象(例如类实例)时,只有将它们标记为 Serializable 属性 后,才能将它们存储到 StateServer
或 SQLServer
中。
在 Global.asax 文件中有与 Session
相关的特定事件:Session_Start
和 Session_End
。
Session_End
事件仅在 InProc
中触发,它不支持使用 OutProc
实现的 Session 管理。
使用 Session
状态的一个重要考虑因素是 Session 会过期。默认情况下,如果用户在 20 分钟内(默认)未访问其 Session 数据,则 Session 将过期,并且存储在 Session 中的所有项都将被丢弃。因此,在尝试处理从 Session 返回的对象之前,检查该对象是否存在或是否为 null
非常重要。例如:
object sessionObject = Session["someObject"]; if (sessionObject != null) { myLabel.Text = sessionObject.ToString(); }
Session 超时可以通过 web.config 设置进行调整,但增加超时值可能会给服务器带来不希望的内存压力。
<sessionState timeout="number of minutes" />
其他常用的 Session
方法是:
Session.Abandon()
- 删除Session
及其包含的所有项Session.Clear()
- 删除Session
中的所有项Session.RemoveAll()
- 删除Session
中的所有项Session.Remove("itemName")
- 删除以“itemName
”为名存储的项
操作指南
- ASP.NET Session State Overview - 从这个优秀的 MSDN 文档开始
- 在 ASP.NET 中使用 Session 和 Application 对象
- 选择维护和存储 ASP.NET Session 状态的方法
- 驯服无状态的野兽:在 Web 场中跨服务器管理 Session 状态
- ASP.NET Session State FAQ - Peter Bromberg:“下面是不同 Session 状态模式的快速总结,然后是一系列常见问题解答,这些问题解答收集自多个来源,包括我自己的‘发现’。”
- 如何在一台故障转移群集中使用 ASP.NET Session State SQL Server Mode - “本文介绍了配置 Web 服务器群集以使用运行在故障转移群集中的 SQL Session State 所需的信息。”
白皮书/博客
- 状态管理 - 一个关于在各种位置存储状态的决策过程、优点和缺点的良好博客概述。
- 状态管理和 ASP.NET - 一篇很好的基础白皮书,列出了你进行状态管理的各种选项。
KB:ASP.NET 状态管理概述 - 一篇枯燥但相当全面的关于 Session 状态的 KB 文章。 - Microsoft ASP.NET 2.0 Providers: Introduction 和 Session State Providers - “Session 状态提供程序提供 Microsoft ASP.NET 的 Session 状态模块与 Session 状态数据源之间的接口。”如果你打算编写自己的提供程序,或者只是想了解现有的提供程序之一,MSDN 文档是一个很好的起点。
- 这是 MSDN 中的一个简短部分,它提供了一些可能感兴趣的晦涩细节的见解。
- 为 Web 应用程序提供快速、可扩展且安全的 Session 状态管理 - MSDN 杂志一篇关于 ASP.NET Session 状态架构的优秀文章。
- 架构和性能考虑因素 - 一篇非常有见地的博客文章,可以帮助你决定使用哪个 Session 提供程序。
- 探索 ASP.Net 中的 Session - Code Project:本文介绍了 ASP.NET 2.0 中的 Session。不同类型的 Session 及其配置。还介绍了 Web Farm、负载均衡器、Web Garden 等场景下的 Session。
尽情享用!