浅谈ASP.NET状态管理器

开发 后端
本文介绍ASP.NET状态管理器,实现这些特性的正是上节提到的 SessionStateModule.InitModuleFromConfig 函数中,根据 sessionState 标记的 mode 属性选择的四种不同的ASP.NET状态管理器实现。

状态管理本来是一件很美好的事情,嘿嘿,只可惜总是有些厂商在实现的时候考虑得不那么周全。例如 MS 在 ASP状态管理实现就比较烂,因为只实现了一个进程内的基于内存的状态管理,故而存在很多问题:
1.所有的 Session 数据都保存在 Web 服务的进程中,会造成服务器支持会话数量受到服务器内存资源的限制问题,同时也因为大量非活动会话导致内存被无效占用。
2.服务器进程崩溃会导致所有的会话数据丢失。
3.会话无法跨进程或在负载均衡情况下使用,除非负载均衡技术保障同一用户每次都能被路由到同一机器上。就算这样也无法保障服务器崩溃造成的会话数据丢失。
4.需要 Cookie 的支持,而现在因为安全性问题,很多人在浏览器中关闭了 Cookie 和 js 的支持。

为此 ASP 的使用者不得不自己手工将会话信息以会话 ID 为主键同步到外部数据库中,以缓解类似问题。

而在 ASP.NET 中,因为设计时就考虑了这些问题,能够避免这些限制:
1.支持进程外的状态管理,通过独立状态管理服务或 SQL Server 状态服务器管理会话状态
2.支持不使用 Cookie 的状态维护,通过在 URL 中自动增加会话 ID 来避免使用 Cookie
3.通过独立的状态管理服务或SQL Server 状态服务器支持负载均衡时同步使用会话信息

实现这些特性的正是上节提到的 SessionStateModule.InitModuleFromConfig 函数中,根据 sessionState 标记的 mode 属性选择的四种不同的ASP.NET状态管理器实现。

  1. <system.web> 
  2. <sessionStatemodesessionStatemode="InProc" 
  3. stateConnectionString="tcpip=127.0.0.1:42424" 
  4. stateNetworkTimeout="10" 
  5. sqlConnectionString="datasource=127.0.0.1;IntegratedSecurity=SSPI" 
  6. cookieless="false" 
  7. timeout="20"/> 
  8. </system.web> 

ConfigInit 方法主要在初始化状态管理器时通知其根据配置进行初始化工作,并将负责会话状态清除的 SessionOnEndTarget 对象实例绑定到会话管理器(我们后面讨论会话状态管理实现时详细讨论)。对 OutOfProcStateClientManager 和 SqlStateClientManager 来说,在此阶段还会初始化与外部服务器的连接,并通过一个 System.Web.Util.ResourcePool 实例,提供基于时间策略的资源池来维护连接;

ResetTimeout 方法重置指定 Session 的超时时间;对 InProcStateClientManager 来说,这个超时时间是通过 System.Web.Caching.CacheInternal 类型实现的缓存对象来使用的; OutOfProcStateClientManager 直接通过 MakeRequest 函数构造请求发给外部独立的状态管理器执行; SqlStateClientManager 则调用存储过程 TempResetTimeout 更新 ASPStateTempSessions 表的过期时间 Expires 字段;

Dispose 方法是否状态管理器的资源,落实到代码就是对 OutOfProcStateClientManager 和 SqlStateClientManager 中资源池的释放;

Set 方法则将指定的 SessionStateItem 存储到 id 相关的会话数据中,并根据 inStorage 指定的对象状态,决定在发生异常的情况下是否释放对此会话的锁。与 ResetTimeout 的实现类似,OutOfProcStateClientManager 发送请求给外部独立的状态管理器;SqlStateClientManager 调用存储过程 TempUpdateStateItemXXX 更新会话状态表 ASPStateTempSessions 中的过期时间 Expires 字段、锁定状态 Lock 字段、以及状态信息 SessionItemShort/SessionItemLong (分别保存 7000字节以下或之上的数据)。如发生异常并设置 inStorage 标记,则先调用 TempReleaseStateItemExclusive 释放会话锁。

对ASP.NET状态管理器中数据的获取较为复杂,IStateClientManager 接口使用的是异步调用的模式,并为提高效率将独占的获取数据单独拿出来。状态管理器实现类通过通用基类 System.Web.SessionState.StateClientManager 实现的几个工具方法,将数据获取操作异步化。再最终由实现类通过 Get 和 GetExclusive 方法完成操作。获取数据的方法 InProcStateClientManager 通过缓存;OutOfProcStateClientManager 通过请求;SqlStateClientManager 通过 TempGetStateItemXXX 存储过程完成。

【编辑推荐】

  1. ASP.NET开发技巧之Theme功能浅析
  2. 详解ASP.NET动态编译
  3. Apache支持ASP.NET方法浅析
  4. 浅谈ASP.NET服务器标准控件
  5. ASP.NET中SQL Server数据库备份恢复浅析
责任编辑:佚名 来源: 51CTO.COM
相关推荐

2009-07-28 16:03:23

ASP.NET状态服务

2009-08-05 17:39:13

ASP.NET常用状态

2009-08-04 14:36:00

ASP.NET分页管理

2009-07-20 15:30:11

ASP.NET应用

2009-07-22 16:11:43

ASP.NET AJA

2009-07-24 10:52:42

ASP.NET ISA

2009-07-21 14:16:02

ASP.NET管道优化

2009-07-23 15:24:37

ASP.NET Ima

2009-07-27 16:19:59

ASP.NET报表控件

2011-08-23 10:58:59

2009-07-22 13:24:24

ASP.NET MVC

2009-08-05 15:29:33

ASP.NET For

2009-08-10 10:19:47

ASP.NET组件设计

2009-07-28 17:49:30

ASP.NET定期回收

2009-07-20 17:12:17

ASP.NET访问数据

2009-07-23 15:44:39

ASP.NET MVC

2009-08-04 17:18:37

2009-07-28 10:43:23

Web服务器ASP.NET

2009-07-28 11:09:02

ASP.NET状态类型

2009-07-27 13:01:28

TreeViewASP.NET
点赞
收藏

51CTO技术栈公众号