|
 |
栏目导栏 |
|
| |
|
|
|
|
 |
资料搜索 |
|
| |
|
|
|
|
 |
热门文章 |
|
| |
|
|
|
|
 |
最新文章 |
|
| |
|
|
|
| |
| |
|
|
|
|
vkFLinux联盟 httpModules 节点指定了 HttpApplication 需要初始化的模块列表,而在前面提到的 HttpApplication.InitModules 函数正式根据此列表进行初始化的 vkFLinux联盟 private void HttpApplication.InitModules() vkFLinux联盟 { vkFLinux联盟 HttpModulesConfiguration cfgModules = ((HttpModulesConfiguration) HttpContext.GetAppConfig("system.web/httpModules"[img]/images/wink.gif[/img]); vkFLinux联盟 vkFLinux联盟 if (cfgModules == null) vkFLinux联盟 { vkFLinux联盟 throw new HttpException(HttpRuntime.FormatResourceString("Missing_modules_config"[img]/images/wink.gif[/img]); vkFLinux联盟 } vkFLinux联盟 _moduleCollection = cfgModules.CreateModules(); vkFLinux联盟 vkFLinux联盟 for(int i = 0; i < _moduleCollection.Count; i++) vkFLinux联盟 { vkFLinux联盟 _moduleCollection[i].Init(this); vkFLinux联盟 } vkFLinux联盟 vkFLinux联盟 GlobalizationConfig cfgGlobal = ((GlobalizationConfig) HttpContext.GetAppConfig("system.web/globalization"[img]/images/wink.gif[/img]); vkFLinux联盟 if (cfgGlobal != null) vkFLinux联盟 { vkFLinux联盟 _appLevelCulture = cfgGlobal.Culture; vkFLinux联盟 _appLevelUICulture = cfgGlobal.UICulture; vkFLinux联盟 } vkFLinux联盟 } vkFLinux联盟 vkFLinux联盟 vkFLinux联盟 vkFLinux联盟 Session 节点对于的 System.Web.SessionState.SessionStateModule 对象将被 HttpModulesConfiguration.CreateModules 方法构造,并调用其 Init 函数初始化。SessionStateModule 类实际上就是负责管理并创建会话,用户完全可以自行创建一个实现 IHttpModule 接口的类,实现会话的控制,如实现支持集群的状态同步等等。 vkFLinux联盟 SessionStateModule.Init 方法主要负责 machine.config 文件中的 sessionState 配置,调用 SessionStateModule.InitModuleFromConfig 方法建立相应的会话管理器。 vkFLinux联盟 <system.web> vkFLinux联盟 <sessionState mode="InProc" vkFLinux联盟 stateConnectionString="tcpip=127.0.0.1:42424" vkFLinux联盟 stateNetworkTimeout="10" vkFLinux联盟 sqlConnectionString="data source=127.0.0.1;Integrated Security=SSPI" vkFLinux联盟 cookieless="false" vkFLinux联盟 timeout="20" /> vkFLinux联盟 </system.web> vkFLinux联盟 vkFLinux联盟 vkFLinux联盟 vkFLinux联盟 关于不同 mode 的会话管理的话题我们后面再讨论,先继续来看会话的建立过程。 vkFLinux联盟 vkFLinux联盟 在从 machine.config 文件中读取配置信息后,InitModuleFromConfig 方法会向 HttpApplication 实例注册几个会话管理事件处理函数,负责在应用程序合适的情况下维护会话状态。 vkFLinux联盟 private void SessionStateModule.InitModuleFromConfig(HttpApplication app, vkFLinux联盟 SessionStateSectionHandler.Config config, bool configInit) vkFLinux联盟 { vkFLinux联盟 // 处理不使用 Cookie 的情况 vkFLinux联盟 // vkFLinux联盟 vkFLinux联盟 app.AddOnAcquireRequestStateAsync(new BeginEventHandler(this.BeginAcquireState), vkFLinux联盟 new EndEventHandler(this.EndAcquireState)); vkFLinux联盟 app.ReleaseRequestState += new EventHandler(this.OnReleaseState); vkFLinux联盟 app.EndRequest += new EventHandler(this.OnEndRequest); vkFLinux联盟 vkFLinux联盟 // 创建会话管理器 vkFLinux联盟 // vkFLinux联盟 } vkFLinux联盟 vkFLinux联盟 vkFLinux联盟 vkFLinux联盟 BeginAcquireState 和 EndAcquireState 作为一个异步处理器注册到 HttpApplication._acquireRequestStateEventHandlerAsync 字段上;OnReleaseState 则负责在合适的时候清理会话状态;OnEndRequest 则是 OnReleaseState 的一个包装,负责较为复杂的请求结束处理。前面提到的 HttpApplication.InitInternal 函数,在完成了初始化工作后,会将上述这些事件处理器,加入到一个执行队列中,由应用程序在合适的时候,使用流水线机制进行调用,最大化处理效率。有关 ASP.NET 中流水线事件模型的相关介绍,请参考 HTTP PIPELINES vkFLinux联盟 Securely Implement Request Processing, Filtering, and Content Redirection with HTTP Pipelines in ASP.NET 一文中 The Pipeline Event Model 小节,有机会我在写文章详细分析。 vkFLinux联盟 vkFLinux联盟 知道了会话建立的调用流程再来看会话的实现就比较简单了,SessionStateModule.BeginAcquireState 被 HttpApplication 实例在合适的时候调用,处理各种会话的复杂情况后,使用 SessionStateModule.CompleteAcquireState 函数完成实际的会话建立工作,并将封装会话的 HttpSessionState 对象以 "AspSession" 为 key 加入到 HttpContext 的哈希表中,也就是前面提到的 HttpContext.Context 的由来。而 SessionStateModule.OnReleaseState 则从 HttpContext 中删除 "AspSession" 为 key 的 HttpSessionState 对象,并对会话管理器进行同步工作。 vkFLinux联盟 vkFLinux联盟 至此,ASP.NET 中的会话建立流程大概就分析完毕了,下一小节将进一步展开分析多种不同会话管理器的实现原理与应用。vkFLinux联盟
状态管理本来是一件很美好的事情,嘿嘿,只可惜总是有些厂商在实现的时候考虑得不那么周全。例如 MS 在 ASP 中的状态管理实现就比较烂,因为只实现了一个进程内的基于内存的状态管理,故而存在很多问题: vkFLinux联盟 vkFLinux联盟 1.所有的 Session 数据都保存在 Web 服务的进程中,会造成服务器支持会话数量受到服务器内存资源的限制问题,同时也因为大量非活动会话导致内存被无效占用。 vkFLinux联盟 2.服务器进程崩溃会导致所有的会话数据丢失。 vkFLinux联盟 3.会话无法跨进程或在负载均衡情况下使用,除非负载均衡技术保障同一用户每次都能被路由到同一机器上。就算这样也无法保障服务器崩溃造成的会话数据丢失。 vkFLinux联盟 4.需要 Cookie 的支持,而现在因为安全性问题,很多人在浏览器中关闭了 Cookie 和 js 的支持。 vkFLinux联盟 vkFLinux联盟 为此 ASP 的使用者不得不自己手工将会话信息以会话 ID 为主键同步到外部数据库中,以缓解类似问题。 vkFLinux联盟 vkFLinux联盟 而在 ASP.NET 中,因为设计时就考虑了这些问题,能够避免这些限制: vkFLinux联盟 vkFLinux联盟 1.支持进程外的状态管理,通过独立状态管理服务或 SQL Server 状态服务器管理会话状态 vkFLinux联盟 2.支持不使用 Cookie 的状态维护,通过在 URL 中自动增加会话 ID 来避免使用 Cookie vkFLinux联盟 3.通过独立的状态管理服务或SQL Server 状态服务器支持负载均衡时同步使用会话信息 vkFLinux联盟 vkFLinux联盟 实现这些特性的正是上节提到的 SessionStateModule.InitModuleFromConfig 函数中,根据 sessionState 标记的 mode 属性选择的四种不同的状态管理器实现。 vkFLinux联盟 <system.web> vkFLinux联盟 <sessionState mode="InProc" vkFLinux联盟 stateConnectionString="tcpip=127.0.0.1:42424" vkFLinux联盟 stateNetworkTimeout="10" vkFLinux联盟 sqlConnectionString="data source=127.0.0.1;Integrated Security=SSPI" vkFLinux联盟 cookieless="false" vkFLinux联盟 timeout="20" /> vkFLinux联盟 </system.web> vkFLinux联盟 vkFLinux联盟 vkFLinux联盟 vkFLinux联盟 Off 模式禁止会话管理,同时 ASP.NET 还允许通过在页面中以 EnableSessionState 属性细粒度管理页面的会话支持状态 vkFLinux联盟 <%@ Page EnableSessionState=" True|False|ReadOnly" %> vkFLinux联盟 vkFLinux联盟 vkFLinux联盟 InProc 模式兼容以前 ASP 的策略,在 ASP.NET 同一进程空间内实现基于内存的会话状态管理,速度最快但受到与 ASP 相同的限制; vkFLinux联盟 StateServer 模式通过 ASP.NET 独立安装的 ASP.NET State Service 服务(aspnet_state.exe),以 stateConnectionString 指定的IP和端口响应会话状态服务; vkFLinux联盟 SQLServer 模式则通过 sqlConnectionString 指定的 SQL Server 服务器,以内存临时表(以 InstallSqlState.sql建库,使用 tempdb 内存数据库)或独立表(以InstallPersistSqlState.sql 监控,使用独立的 ASPState 库)维护会话状态。 vkFLinux联盟 vkFLinux联盟 这四种不同的状态管理器,在性能上据《Performance Tuning and Optimizing ASP.NET Appliation》一书的测试,相对值如下: vkFLinux联盟 vkFLinux联盟 以下为引用: vkFLinux联盟 vkFLinux联盟 Table 4-1: Normalized TTLB(Time to Last Byte) by Session State Mode (in Milliseconds per 100 Requests) vkFLinux联盟 vkFLinux联盟 CONCURRENT BROWSERS MODE = OFF MODE = INPROC MODE = STATESERVER MODE = SQLSERVER vkFLinux联盟 1 7.81 4.54 8.27 8.47 vkFLinux联盟 5 28.28 20.25 27.25 29.29 vkFLinux联盟 10 89.38 46.08 77.29 85.11 vkFLinux联盟 vkFLinux联盟 vkFLinux联盟 Table 4-2: Average Requests per Second by Session State Mode vkFLinux联盟 vkFLinux联盟 CONCURRENT BROWSERS MODE = OFF MODE = INPROC MODE = STATESERVER MODE = SQLSERVER vkFLinux联盟 vkFLinux联盟 1 18.86 24.17 18.31 18.11 vkFLinux联盟 5 21.66 25.74 21.54 21.34 vkFLinux联盟 10 17.23 23.8 18.11 17.6 vkFLinux联盟 vkFLinux联盟 vkFLinux联盟 vkFLinux联盟 vkFLinux联盟 可以看到,无论是从 TTLB 还是每秒平均请求数来说,进程外状态管理器的性能都是可以令人接受的,当然还需要针对状态管理情况在编写代码时做相关优化。不过要使用进程外状态管理器,则保存在会话中的对象受到必须提高二进制序列化支持的限制。 从使用角度来看,状态管理器实际上都是由上节提到的 HttpSessionModule 建立管理,并通过 HttpSessionState 接口提供访问的.
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论 |
|
|
|
|
|