什么是会话?
web 页面是无状态的,这就意味着每个页面新实例被创建都是要发送数据到服务器的。
大家都知道 HTTP 是一种无状态协议,它不能记忆页面上的的客户资料。 如果用户插入一些信息或转到下一页,这些数据将会丢失,并且用户将无法检索以上信息。 所以我们需要存储页面的相关信息以保存客户端必要的数据存储。
会话提供了客户端数据在服务器端内存中的保存;它可以支持包括我们自定义的对象在内的任何类型的对象的存储。 意味着对每个客户端会话数据分别存储。 看看下面的关系图。
ASP.NET 状态管理中最佳的一个功能就是会话。用户数据是安全的、 具透明度,我们可以在其中存储任何类型的对象。随之而来的是关于客户端数据存储在服务器端还是存储在客户端的性能方面争论。接下来看看web应用程序中使用会话的优缺点吧。
会话的优缺点?
下面是使用会话的基本优缺点。
优势:
-- 有助于在应用程序维护用户状态和数据。
-- 可以存储包括自定义的任何类型的对象
-- 将每个客户端数据分别存储。
-- 用户会话是安全的和具透明度的。
缺点:
-- 因为会话数据存储在服务器内存所以会加大服务器开销。
-- 所涉及的序列化和反序列化会话数据的架空。 因为在 SQL Server 和 StateServer 会话模式的情况下,我们需要在存储区之前序列化该对象。
此外,有许多优点和缺点会话的会话类型为基础。
会话中值的存取
会话中值的存取与ViewState 非常类似;可以使用会话状态与 System.Web.SessionState.HttpSessionState 类进行交互,因为它提供了 Asp.Net 页的会话对象的生成
会话存储值:
Session["UserName"] = txtUser.Text;
会话中提取值:
if (Session["UserName"] != null)
{
//Retrieving UserName from Session
lblWelcome.Text = "Welcome : " + Session["UserName"];
}
else
{
//Do Something else
}
还可以存储某些其他对象。 以下示例显示如何将数据集存储在会话。
存储:
Session["DataSet"] = _objDataSet;
取出数据集:
if (Session["DataSet"] != null)
{
//Retrieving UserName from Session
DataSet _MyDs = (DataSet)Session["DataSet"];
}
else
{
//Do Something else
}
SessionID
Asp.Net 使用 120 位标识符来跟踪每个会话。 这是足够的安全和不能将反向工程。 当客户端与服务器进行通信,只用传递SessionID。当 ASP.NET 客户端发出请求时就根据SessionID检索相应的数据.
服务器为该客户端创建一个唯一的会话 ID,并存储在会话状态提供程序。
当客户端再次客从服务器请求数据时,服务器可以根据分配给客户端的的唯一的SessionID 从状态服务器检索到对应数据并完成序列化与类型转换返回数据。
处理流程图如下:
通信的客户端、 Web 服务器,和状态提供程序
会话模式和状态提供程序
以下是ASP.NET 会话模式下可用的情况下
InProc 本进程中 内存对象中
StateServer 状态服务器 Aspnet_state.exe
SQLServer 数据服务器
Custom 自定义存储
会话状态的体系结构
可以根据选择的会话状态提供程序来选择如何保存会话状态;ASP.NET 请求的任何信息都是基于SessionID的,
除此之外的另一个模式"Off", 如果我们选择了此选项,会话将被禁用。 若要使用会话,应该考虑该以上四种会话状态模式。
参考:
Application and Session Events
Read SQL Server Mode
ASP.NET Session State Overview
Web Farm-Load Balancing in ASP.NET