IRequiresSessionState
和IReadOnlySessionState
除了第二个保存对会话变量的更改无效之外有什么区别?
两者都使我能够在HttpHandler
中访问会话变量。但为什么我更喜欢IReadOnlySessionState
?它只是限制我保存下一个请求的会话
或者它是否比IRequiresSessionState
给我提供了性能优势?
我何时更愿意使用IReadOnlySessionState
而不是IRequiresSessionState
?
答案 0 :(得分:24)
一个关键的区别是IRequiresSessionState对当前会话设置了一个独占锁,从而潜在地限制了当前用户的并发请求数。 (有关此锁定现象的更多背景信息,请参阅Is it possible to force request concurrency when using ASP.NET sessions?)
相比之下,IReadOnlySessionState不会获得排他锁。
这与renad's helpful answer to an almost identical SO question中记录的内容相同。
我发现的最好的官方文档来自MSDN文章Session State Providers:
会话状态提供程序中最重要的三个方法是GetItem,GetItemExclusive和SetAndReleaseItemExclusive。前两个由SessionStateModule调用,以从数据源检索会话。如果请求的页面实现了IRequiresSessionState接口(默认情况下,所有页面都实现IRequiresSessionState),则SessionStateModule的AcquireRequestState事件处理程序会调用会话状态提供程序的GetItemExclusive方法。方法名称中的“独占”一词意味着只有在其他请求当前未使用会话时才应检索该会话。另一方面,如果请求的页面实现了IReadOnlySessionState接口(实现此目的的最常见方式是在页面的@Page指令中包含EnableSessionState =“ReadOnly”属性),则SessionStateModule将调用提供程序的GetItem方法。此处不需要排他性,因为SessionStateModule允许重叠读访问。
请注意显式使用这些接口和使用EnableSessionState Page指令之间的并行:
答案 1 :(得分:7)
该接口控制框架是否将在请求结束时保存当前会话状态。当您使用进程外会话状态存储时,它会产生更大的不同。在这种情况下,如果没有接口,系统仍会将会话数据存储在远程数据库中,即使它没有更改(系统也不会跟踪会话数据是否在请求期间被修改)。使用IReadOnlySessionState接口时,将跳过写回阶段。
答案 2 :(得分:1)
关注此http://msdn.microsoft.com/en-us/library/system.web.sessionstate.irequiressessionstate.aspx
IRequiresSessionState派生自System.Web.SessionState 使用此接口,我们访问Httphandler中的会话和类文件
如果您需要对Session的只读访问权限,请实现IReadOnlySessionState接口。