关于自定义SessionState存储之SessionStateStoreProviderBase类

SessionStateStoreProviderBase类


为session-state数据存储的提供者定义需要成员.

[AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level 
=  AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level 
=  AspNetHostingPermissionLevel.Minimal)]
public  abstract  class  SessionStateStoreProviderBase : ProviderBase


Asp.net session state 使用session-state储存提供者(provider)从数据存储读和写session数据.一个session-state store provider是继承SessionStateStoreProviderBass抽象类和重写它的成员实现详细数据存储.这个Session- state store provider被SessionStateModule类调用在ASP.NET页面的进程与存储到数据存储中进行交流期间并且找回session变量和 相关session信息如time-out值.

每一个ASP.NET应用程序内Session data被存储在单独的SessionID属性中.ASP.NET应用程序不能分享session data.

你能指定一个自定义的SessionStateStoreProviderBase,通过在配置文件中sessionState元素设置mode属性为Custom和customProvider属性指定provide名来实现ASP.NET应用程序.


Locking Session Store Data


因为ASP.NET应用程序是多线程支持响应并发请求,它能并发请求尝试访问同一个Session信息.考虑一个场景有一个frameset有多个 frames访问同一个应用程序.这里在服务端并发不同的线程独立请求在frameset中每一个frame.如果ASP.NET页面为每一个 frame来源访问session-state变量,之后,你用多线程并发访问session 存储.

在session储存和异常的session-state行为中避免数据冲突.SessionStateModule和 SessionStateStoreProviderBase类包括了lock功能,就是在ASP.NET页面在执行的整个期间使用排它琐琐住 session 存储的item.注意如果EnableSessionState属性设置为ReadOnly,没有琐住这个session-store item,另外同一个应用程序ASP.NET页面能写一个 session 存储,所以一个请求read-only session数据仍然需要等待被锁数据释放.

在请求开始时:SessionStateModule 对象调用GetItemExclusive方法,在这个期间有一个AcquireRequestState事件,当EnableSessionState 属性设置为true时,也是默认情形,如果EnableSessionState属性设置为ReadOnly,SessionStateModule对象 调用的方法就改为GetItem方法.

GetItemExclusive返回一个SessionStateStoreData对象主要是从数据存储中移植session信息,更新存储数据的有 效日期,并且在请求期间在存储数据中lock session-item data.如果在数据存储中没有session-item数据,这时GetItemExclusive方法设置locked参数为false并且返回 null引用.这个原因SessionStateModule对象会在数据存储中调用CreateNewStoreData方法去创建一个新的 session item.如果session-item数据被找到但数据被lock,这时GetItemExclusive方法设置locked参数为"true",设 置lockAge参数为当前日期和时间减去这时的日期和当item被锁时的时间(从数据存储中找回),设置lockId参数为从
数据存储中找回的lock标记,并且返回一个null引用.这个原因是SessionStateModule对象在每间隔半秒就会常识找回session -item信息并且获得关于数据的一个lock.如果lcokAge参数值设置为超越ExecutionTimeout,然后 SessionStateModule 调用ReleaseItemExculusive方法去清出这个lock session-item 数据,并且然后再调用GetItemExclusive方法.

因为被锁着的session-store数据要等待在每一个线程调用ReleaseItemExclusive的方法被释放之前要为当前响应,试图能设置 和释放已经被其他session释放和修改的session-state存储数据调用SetAndReleaseItemExclusive方法.为避免 这种情形,这里的GetItem和GetItemExclusive方法返回一个lock标记.这个lock标记必须包括每一个请求被修改locked session-store data.Session-store数据只在如果lock标识在数据存储匹配SesssionStateModule里提供的lock 标识时会被修改.




Deleting Expired Session Store Data


但为一个session调用Abandon方法时,这个数据要从数据存储中删除就要调用RemoverItem方法.另一方面这个数据将保留在 Session数据存储中直到Sever端在未来再次请求Session时.它是使用SessionStateStoreProviderBase实现删 除过期session数据.

< configuration >
  
< connectionStrings >
    
< add  name ="OdbcSessionServices"  connectionString ="DSN=SessionState;"  />
  
</ connectionStrings >

  
< system.web >
    
< sessionState
      
mode ="Custom"
      customProvider
="OdbcSessionProvider" >
      
< providers >
        
< add  name ="OdbcSessionProvider"
             type
="Samples.AspNet.Session.OdbcSessionStateStore"
             connectionStringName
="OdbcSessionServices"  />
      
</ providers >
    
</ sessionState >
  
</ system.web >
</ configuration >

你可能感兴趣的:(Provider)