IRequiresSessionState vs IReadOnlySessionState
本文关键字:IReadOnlySessionState vs IRequiresSessionState | 更新日期: 2023-09-27 18:13:38
除了无法保存会话变量的更改之外,IRequiresSessionState
和IReadOnlySessionState
之间的区别是什么?
都为我提供了访问HttpHandler
中的会话变量的能力。但我为什么更喜欢IReadOnlySessionState
呢?它只是限制我为下一个请求保存会话。
还是说它比IRequiresSessionState
更有性能优势?
什么时候我更喜欢使用IReadOnlySessionState
而不是IRequiresSessionState
?
一个关键的区别是IRequiresSessionState对当前会话设置了排他锁,从而可能限制当前用户并发请求的数量。(有关此锁定现象的更多背景信息,请参见在使用ASP时是否有可能强制请求并发?网络会议?)
相反,IReadOnlySessionState不获取排他锁。
这与renad对几乎相同的SO问题的有用回答中记录的内容相同。
我找到的最好的官方文档来自MSDN文章Session State Providers:
会话状态提供程序中最重要的三个方法是GetItem、GetItemExclusive和SetAndReleaseItemExclusive。前两个由SessionStateModule调用,以从数据源检索会话。如果请求的页面实现了IRequiresSessionState接口(默认情况下,所有页面都实现了IRequiresSessionState), SessionStateModule的AcquireRequestState事件处理程序调用会话状态提供程序的GetItemExclusive方法。方法名中的"Exclusive"一词意味着只有当会话当前没有被其他请求使用时才应该检索会话。另一方面,如果被请求的页面实现了IReadOnlySessionState接口(实现这一点的最常见方法是在页面的@ page指令中包含一个EnableSessionState="ReadOnly"属性),SessionStateModule调用提供程序的GetItem方法。这里不需要独占性,因为SessionStateModule允许重叠的读访问。
注意显式使用这些接口和使用EnableSessionState Page指令之间的并行:
- EnableSessionState=False <-> no I*SessionState接口
- EnableSessionState=True <-> IRequiresSessionState接口
- EnableSessionState=ReadOnly <-> IReadOnlySessionState
该接口控制框架是否在请求结束时保存当前会话状态。当您使用进程外会话状态存储时,它会产生更大的差异。在这种情况下,如果没有接口,系统仍然会将会话数据存储在远程数据库中,即使它没有更改(系统不会跟踪会话数据在请求期间是否被修改)。当您使用IReadOnlySessionState接口时,会跳过回写阶段。
遵循此http://msdn.microsoft.com/en-us/library/system.web.sessionstate.irequiressessionstate.aspx
IRequiresSessionState派生自System.Web.SessionState使用这个接口我们访问httpandler和Class文件中的会话
如果你需要只读访问会话,实现IReadOnlySessionState接口。