关于自定义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数据.
为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>
<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>