Web使用的状态管理——服务器端状态管理

Web应用的状态管理——服务器端状态管理

可通过应用程序状态(Application)、会话状态(Session)、配置文件、数据库保存会话状态来实现
Web使用的状态管理——服务器端状态管理

服务器端状态维护技术有会话状态和应用程序状态

首先我们看看会话状态

会话状态是ASP.NET中非常重要的服务器端状态管理技术,同时也是功能很强大的状态管理技术。
会话状态是特定于用户的,当一个用户开始访问Web应用程序时,将会产生一个会话状态。
不同的用户具有不同的会话状态,如果有一万个用户,将会有一万个会话状态。
会话状态在存储与用户相关的信息方面非常有用,如博客登录后就可以使用会话状态存储通过验证的用户信息。

会话标识符

浏览器的会话使用存储在 SessionID 属性中的唯一标识符进行标识
会话 ID 使 ASP.NET 应用程序能够将特定的浏览器与 Web 服务器上相关的会话数据和信息相关联
会话 ID 的值在浏览器和 Web 服务器间通过 Cookie 进行传输,如果指定了无 Cookie 会话,则通过 URL 进行传输

无Cookie的SessionID
将Web.config 文件的 sessionState 节的 cookieless 属性设置为 true,可以指定不将会话标识符存储在 Cookie 中,而是存储在URL中

<configuration>
  <system.web>
    <sessionState cookieless="true" />
  </system.web>
</configuration>

http://localhost:10765/StateManageDemo/(S(hfuvhje2whhmnhyaocja54r0))/Default.aspx

配置会话状态

会话状态模式概述
ASP.NET 会话状态支持若干用于会话数据的存储选项
在 Web.config 文件中为 sessionState 元素的 mode 属性分配一个 SessionStateMode 枚举值,可以指定ASP.NET 会话状态使用的模式

InProc模式(进程内模式)
是默认会话状态模式,使用SessionStateMode枚举的InProc值指定
进程内模式将会话状态值和变量存储在本地 Web 服务器的内存中
是唯一支持 Session_End 事件的模式
StateServer模式(状态服务器模式)
会话状态存储在一个称为 ASP.NET 状态服务的进程中,该进程是独立于 ASP.NET 辅助进程或 IIS 应用程序池的单独进程
使用此模式可以确保在重新启动 Web 应用程序时保留会话状态,并使会话状态可用于网络场中的多个 Web 服务器
<configuration>
  <system.web>
    <sessionState mode="StateServer"
      stateConnectionString="tcpip=SampleStateServer:42424"
      cookieless="false" timeout="20"/>
      </system.web>
</configuration>

SQL Server模式

会话状态存储到一个 SQL Server 数据库中
可以确保在重新启动 Web 应用程序时保留会话状态,并使会话状态可用于网络场中的多个 Web 服务器
<configuration>
  <system.web>
    <sessionState mode="SQLServer"
      sqlConnectionString="Integrated Security=SSPI;datasource=SampleSqlServer;" />
  </system.web>
</configuration>

Custom摸式(自定义模式)
指定使用自定义会话状态存储提供程序来存储会话状态数据
在Web.config中配置sessionState 的提供程序为自定义的会话状态存储提供程序

Off模式:此模式禁用会话状态。

会话状态事件

在Global.asax文件编写用于管理用户会话的事件:
Session_Start 事件:在新会话开始时触发
Session_End 事件:在会话被放弃或过期时触发

Session_Start事件:通过向Global.asax文件添加一个名为Session_Start的事件过程来处理。如果请求开始一个新会话,Session_Start事件过程会在请求开始时运行。如果请求不包含SessionID值或请求所包含的SessionID属性引用一个已过期的会话,则会开始一个新会话。可以使用Session_Start事件初始化会话变量并跟踪与会话相关的信息。
Session_End事件:通过向Global.asax文件添加一个名为Session_End的事件过程来处理。Session_End事件过程在调用Abandon方法或会话过期时运行。如果超过了某一会话Timeout属性指定的分钟数并且在此期间内没有请求该会话,则该会话过期。

会话状态变量的使用

向会话状态添加项
以键/值对形式直接向Session中添加项以持久保留值 ,并且根据添加的键名称访问会话状态的值

//添加
 Session["UserName"] ="mary";
或: Session.Add("UserName ","mary");
//访问
If(Session ["UserName"] != null)
{
         string strUsername = Session ["UserName"].ToString();
}

会话的过期
配置会话过期时间,默认过期时间为20分钟

 <configuration>
  <system.web>
    <sessionState mode="InProc" timeout="30" />
  </system.web>
</configuration>
编写代码设置Session对象的Timeout属性,来设置会话状态过期时间
void Session_Start(object sender, EventArgs e)
 {
        Session.Timeout = 30;
}

使用会话状态

删除会话状态中的项
调用Session对象的Clear和RemoveAll方法来删除会话状态集合中的所有项
调用Remove和RemoveAt删除其中的某一项
调用Abandon方法取消当前会话,即会话立即过期

Session.Remove("UserName");
Session. Abandon();

会话状态的利弊

使用会话状态的优点:
实现简单。
会话特定的事件。
数据持久性。
平台可伸缩性。
无需Cookie支持。
可扩展性。
使用会话状态的缺点:
使用会话状态时,要注意其性能问题。

应用程序状态

应用程序状态是一种全局存储机制,可以供Web应用程序中的所有页面(或Global.asax文件)访问
存储在HttpApplicationState 类的实例中,该类在客户端第一次从某个特定的 ASP.NET 应用程序虚拟目录中请求任何 URL 资源时创建
目的在于存储需要在服务器往返行程之间及页请求之间维护的信息
添加和读取应用程序状态中的值

应用程序状态存储在一个键/值字典中,可以将特定于应用程序的信息添加到此结构以在页请求期间读取它
一般在Global.asax文件中的应用程序启动事件中初始化应用程序状态值,而在所有的页面中都可以访问
Application.Lock();
Application["WebVisitCount"] = (int)Application["WebVisitCount"] + 1;
Application.UnLock();

删除应用程序状态的值

调用HttpApplicationState类的Clear或RemoveAll方法,删除应用程序状态集合中的所有变量
调用Remove或RemoveAt方法来清除某一个变量

Application.Remove(“TotalCounter”); //通过传递变量名来删除
Application.RemoveAt(0); //通过传递序号来删除

应用程序状态的利弊

使用应用程序状态的优点如下:
实现简单。应用程序状态易于使用,通过键/值对进行存储和访问。
应用程序的范围。由于应用程序状态可供应用程序中的所有页来访问,因此在应用程序状态中存储信息可能意味着仅保留信息的一个副本。
使用应用程序状态的缺点如下:
资源要求。由于应用程序状态存储在内存中,因此比将数据保存到磁盘或数据库中速度更快。但是,在应用程序状态中存储较大的数据块可能会耗尽服务器内存,这会导致服务器将内存分页到磁盘。
易失性。由于应用程序状态存储在服务器内存中,因此每当停止或重新启动应用程序时应用程序状态都将丢失。