当前位置:首页 > 网络编程 > WEB编程 > ASP.net >  在asp.net中实现会话状态基础 2

 在asp.net中实现会话状态基础 2

点击次数:19 次 发布日期:2008-11-26 10:43:48 作者:源代码网
源代码网推荐      在asp.net中实现会话状态基础负责设置每个用户的会话状态的 HTTP 模块为 SessionStateModule。该模块的结构是根据 IHttpModule 接口设计的,它为 ASP.NET 应用程序提供大量与会话状态有关的服务。包括生成会话 ID、Cookieless 会话管理、从外部状态提供程序中检索会话数据以及将数据绑定到请求的调用上下文。
源代码网推荐  
源代码网推荐    HTTP 模块并不在内部存储会话数据。会话状态始终保存在名为“状态提供程序”的外部组件中。状态提供程序完全封装会话状态数据,并通过 IStateClientManager 接口的方法与其他部分进行通信。会话状态 HTTP 模块调用该接口上的方法来读取并保存会话状态。ASP.NET 1.1 支持三种不同的状态提供程序,如表 1 所示。
源代码网推荐  
源代码网推荐  表 1:状态客户端提供程序
源代码网推荐  
源代码网推荐  提供程序 说明
源代码网推荐  InProc 会话值在 ASP.NET 辅助进程(Microsoft? Windows Server? 2003 中的 aspnet_wp.exe 或 w3wp.exe)的内存中保持为活动对象。这是默认选项。
源代码网推荐  StateServer 会话值被序列化并存储在单独进程 (aspnet_state.exe) 的内存中。该进程还可以在其他计算机上运行。
源代码网推荐  SQLServer 会话值被序列化并存储在 Microsoft? SQL Server? 表中。SQL Server 的实例可以在本地运行,也可以远程运行。
源代码网推荐  
源代码网推荐  
源代码网推荐    会话状态 HTTP 模块将从 web.config 文件的 <sessionState>; 部分读取当前选定的状态提供程序。
源代码网推荐  
源代码网推荐  <sessionState mode="InProc | StateServer | SQLServer />;
源代码网推荐  
源代码网推荐    根据 mode 特性的值,将通过不同的步骤从不同的进程中检索会话状态并将其存储到不同的进程中。默认情况下,会话状态存储在本地的 ASP.NET 辅助进程中。特殊情况下,会将其存储在 ASP.NET Cache 对象的专用槽中(不能通过编程方式访问)。也可以将会话状态存储在外部,甚至是远程进程中(例如,名为 aspnet_state.exe 的 Windows NT 服务中)。第三个选项是将会话状态存储到由 SQL Server 2000 管理的专用数据库表中。
源代码网推荐  
源代码网推荐    HTTP 模块会在请求的一开始对会话值进行反序列化,使它们成为词典对象。然后,将采用编程方式通过类(例如,HttpContext 和 Page)显示的属性 Session 来访问词典(实际上是 HttpSessionState 类型的对象)。会话状态值与开发人员可见的会话对象之间的绑定将持续到请求结束。如果请求成功完成,所有状态值将被序列化回状态提供程序,并可用于其他请求。
源代码网推荐  
源代码网推荐    图 1 说明了请求的 ASP.NET 页面与会话值之间的通信。每个页面所使用的代码都与 page 类上的 Session 属性有联系。其编程方式与传统的 ASP 几乎相同。
源代码网推荐  
源代码网推荐  
源代码网推荐  图 1:ASP.NET 1.1 中的会话状态体系结构
源代码网推荐  
源代码网推荐    在完成请求所需的时间内,会话状态的物理值处于锁定状态。该锁定由 HTTP 模块在内部管理并用于同步对会话状态的访问。
源代码网推荐  
源代码网推荐    会话状态模块实例化应用程序的状态提供程序,并使用从 web.config 文件中读取的信息对其进行初始化。接下来,每个提供程序将继续自己的初始化操作。提供程序的类型不同,其初始化操作会大不相同。例如,SQL Server 状态管理器将打开与给定数据库的连接,而进程外管理器将检查指定的 TCP 端口。另一方面,InProc 状态管理器将存储对回调函数的引用。从缓存中删除元素时将执行此操作,并用于触发应用程序的 Session_OnEnd 事件。
源代码网推荐  
源代码网推荐    同步访问会话状态
源代码网推荐  
源代码网推荐    当 Web 页对 Session 属性进行非常简单且直观的调用时,究竟会出现什么情况呢?许多操作都是在后台进行的,如下面的繁琐代码所示:
源代码网推荐  
源代码网推荐  int siteCount = Convert.ToInt32(Session["Counter"]);
源代码网推荐  
源代码网推荐    上述代码实际上访问的是 HTTP 模块创建的会话值在本地内存中的副本,从特定状态提供程序(参见图 1)中读取数据。如果其他页面也试图同步访问该会话状态,又会如何呢?这种情况下,当前的请求可能会停止处理不一致的数据或过时的数据。为了避免这种情况,会话状态模块将实现一个读取器/写入器锁定机制,并对状态值的访问进行排队。对会话状态具有写入权限的页面将保留该会话的写入器锁定,直到请求终止。
源代码网推荐  
源代码网推荐    通过将 @Page 指令的 EnableSessionState 属性设置为 true,页面可以请求会话状态的写入权限。(这是默认设置)。但是,页面还可以拥有会话状态的只读权限,例如,当 EnableSessionState 属性被设置为 ReadOnly 时。在这种情况下,模块将保留该会话的读取器锁定,直到该页面的请求结束。结果将发生并发读取。
源代码网推荐  
源代码网推荐    做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。
源代码网推荐


源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华