IRequiresSessionState与IReadOnlySessionState

IRequiresSessionStateIReadOnlySessionState之间有什么区别,除了第二个不能保存对会话变量的更改?

两者都为我提供了在HttpHandler访问会话变量的能力。 但为什么我更喜欢IReadOnlySessionState ? 它只是限制我保存下一个请求的会话。
或者它是否比IRequiresSessionState具有性能优势?

我什么时候更喜欢在IRequiresSessionState上使用IReadOnlySessionState

一个关键的区别是IRequiresSessionState对当前会话设置了排他锁,从而可能限制来自当前用户的并发请求数。 (有关此锁定现象的更多背景信息,请参阅使用ASP.NET会话时是否可以强制请求并发? )

相反,IReadOnlySessionState不获取独占锁。

这与renad对一个几乎相同的SO问题的有用答案中记录的情况相同 。

我发现的最好的官方文档来自MSDN文章会话状态提供者 :

会话状态提供程序中三个最重要的方法是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派生的,使用此接口我们访问Httphandler和Class文件中的会话

如果需要对Session的只读访问权限,请实现IReadOnlySessionState接口。