IRequiresSessionState与IReadOnlySessionState

Ole*_*hko 25 c# asp.net httphandler session-state

第二个不能保存对会话变量的更改的区别IRequiresSessionStateIReadOnlySessionState旁边有什么区别?

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

什么时候我宁愿用IReadOnlySessionStateIRequiresSessionState

Chr*_*ris 25

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

相反,IReadOnlySessionState不获取独占锁.

这与雷纳德对一个几乎相同的SO问题的有用答案中记载的情况相同.

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

会话状态提供程序中最重要的三个方法是GetItem,GetItemExclusive和SetAndReleaseItemExclusive.前两个由SessionStateModule调用,以从数据源检索会话.如果请求的页面实现了IRequiresSessionState接口(默认情况下,所有页面都实现IRequiresSessionState),则SessionStateModule的AcquireRequestState事件处理程序会调用会话状态提供程序的GetItemExclusive方法.方法名称中的"独占"一词意味着只有在其他请求当前未使用会话时才应检索该会话.另一方面,如果请求的页面实现了IReadOnlySessionState接口(实现此目的的最常见方式是在页面的@Page指令中包含EnableSessionState ="ReadOnly"属性),则SessionStateModule将调用提供程序的GetItem方法.此处不需要排他性,因为SessionStateModule允许重叠读访问.

请注意显式使用这些接口和使用EnableSessionState Page指令之间的并行:

  • EnableSessionState = False < - > no I*SessionState接口
  • EnableSessionState = True < - > IRequiresSessionState接口
  • EnableSessionState = ReadOnly < - > IReadOnlySessionState

  • 锁定+1 - 如果Web应用程序可以在使用会话状态的同时处理少量异步请求,则**非常重要. (2认同)

Car*_*ond 7

该接口控制框架是否将在请求结束时保存当前会话状态.当您使用进程外会话状态存储时,它会产生更大的不同.在这种情况下,如果没有接口,系统仍会将会话数据存储在远程数据库中,即使它没有更改(系统也不会跟踪会话数据是否在请求期间被修改).使用IReadOnlySessionState接口时,将跳过写回阶段.

  • 你从哪里获得这些信息?你能参考这个链接吗? (2认同)