浅谈ASP.NET状态管理器
创始人
2024-04-25 08:00:43
0

状态管理本来是一件很美好的事情,嘿嘿,只可惜总是有些厂商在实现的时候考虑得不那么周全。例如 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.  
  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.  

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数据库备份恢复浅析

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...