65.9K
CodeProject 正在变化。 阅读更多。
Home

Session

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (2投票s)

2013 年 10 月 11 日

CPOL

4分钟阅读

viewsIcon

12014

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 属性 后,才能将它们存储到 StateServerSQLServer 中。

Global.asax 文件中有与 Session 相关的特定事件:Session_StartSession_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”为名存储的项

操作指南

白皮书/博客

尽情享用!

© . All rights reserved.