当前位置导航:炫浪网>>网络学院>>网页制作>>ASP.NET教程

实现ASP.NET 会话状态存储提供者

  本文描述了一个自定义的会话状态存储提供者实现并示范一个范例提供者的实例。
 
  ASP.NET 会话状态是为了简化 ASP.NET 应用程序在不同的源中存储用户会话数据而被设计的。默认时,会话状态的值和信息被存储在 ASP.NET 进程的内存中。作为选择,你可以把会话数据存储到一个状态服务器中,从而在一个单独的进程中保持会话数据并在 ASP.NET 应用程序被关闭或被重启的时候对其进行保留。另一个选择就是把会话数据存储到一个能够被多个 Web 服务器所共享的 SQL Server 数据库中。
 
  你可以使用 ASP.NET 所提供的会话状态存储,或者你也可以实现自定义会话状态存储提供者。如下就是创建自定义的会话状态存储提供者时的两个主要原因。
 
  你需要在不同于 SQL Server 的数据源中存储会话状态信息(如 FoxPro 数据库或者 Oracle 数据库)。 你需要使用不同于被承载在 .NET Framework 之上的提供者所使用的数据库结构来管理会话状态信息(例如,可能是某个企业或网站中以一个预定义的架构被存储在现有的 SQL Server 数据库中的购物车数据)。 你可以通过创建一个 SessionStateStoreProviderBase 的继承类来实现一个自定义的会话状态存储提供者。关于更多信息,请参考本文的稍后部分:[必需的类]。
 
  会话状态模块在不同时间段内产生了请求的时候,SessionStateModule 类就会调用会话状态存储提供者来读取并写入会话数据。在请求刚开始的时候,SessionStateModule 通过调用 GetItemExclusive 方法从数据源中获取数据,或者在 EnableSessionState 页面参数被设置成 ReadOnly 的时候调用 GetItem 方法。在请求结束的时候,如果会话状态的值已经被更改,那么 SessionStateModule 就会调用 System.Web.SessionState.SessionStateStoreProviderBase.SetAndReleaseItemExclusive(System.Web.HttpContext,System.String,System.Web.SessionState.SessionStateStoreData,System.Object,System.Boolean) 方法把已经被更新的值写入到会话状态存储中。SessionStateModule 会调用 SessionStateStoreProviderBase 实现中的额外成员来初始化一个新的会话并在 System.Web.SessionState.HttpSessionState.Abandon 方法被调用的时候从数据存储中删除会话数据。SessionStateStoreProviderBase 类的每个成员在本文稍后的[必需的类]部分中被详细讨论。
 
  SessionStateModule 能够检测它自已的 SessionID 属性值,胜于对对会话状态存储提供者的依赖。你可以通过创建一个继承自 ISessionIDManager 接口的类来实现自定义的 SessionIDModule.关于更多信息,请参考[ISessionIDManager 接口]中中所提供的备注。
 
  SessionStateManager 将回复到 ASP.NET 进程的身份来访问任何已保护的资源(如某个数据库服务器)。你可以通过把 配置元素的 useHostingIdentity 参数值设置成 false 的方式来指定 SessionStateModule 扮演由 IIS 所提供的身份。例如,如果你已经把 IIS 应用程序配置成使用被集成的 Windows 安全性并且你需要 ASP.NET 扮演由 IIS 所提供的并且与数据源连接所使用的身份相同的角色,然后在应用程序的 Web.config 文件的 配置段中指定 并把 配置元素的 useHostingIdentity 参数设置成 false.如果 useHostingIdentity 参数值为 true,那么在连接到数据源的时候,ASP.NET 将扮演处理器的身份,或者是存在于 配置元素中的用户凭证。关于 ASP.NET 进程身份的更多信息,请参考:[配置 ASP.NET 的进程身份和 ASP.NET 的角色扮演]。
 
  锁定会话存储数据ASP.NET 应用程序通过多线程来支持多个并发请求。使多个并发的请求尝试对相同会话信息的访问变得可能。考虑一个框架集的多个框架全部访问相同应用程序的情节,框架集中每个框架的单独请求可以在 Web 服务器的不同线程中并发地被执行。如果每个框架源中的 ASP.NET 页面都对会话状态变量进行访问,那么你就可以使用多个线程并发地访问会话存储。要避免会话存储以及意外的会话状态行为中的数据出现冲突,SessionStateModule 和 SessionStateStoreProviderBase 类包括了在 ASP.NET 页面的特定会话期间专门对会话存储项进行锁定的功能。注意在 EnableSessionState 参数被标记为

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接