在Inproc模式下与页面只读会话锁争用

jam*_*ode 4 asp.net

我最近发现,当您将页面设置为只读会话并且您正在使用inproc(内存)会话存储时,该会话仍然可以在该页面上写入,并且不是真正的只读.进程外会话存储确实尊重只读设置.

当页面设置为只读并使用inproc模式时,您是否仍然可以获得没有会话锁争用的好处?在readonly和inproc中,具有相同会话ID的多个同时请求是否必须等待会话锁释放?

Sea*_*ugh 6

巴兹安,

Microsoft 关于该主题的文档表明,将页面级会话状态模式设置为“ReadOnly”应该可以保护您免受并发尝试写入会话状态信息的影响(它们将排队并串行处理),但将允许多个读取器。请参阅“同步访问会话状态”部分:

http://msdn.microsoft.com/en-us/library/aa479041.aspx

当页面的EnableSessionState属性设置为“ReadOnly”时,每个页面请求都会尝试获取状态信息的读取器锁定。在标准 ReaderWriterLock 语义中,任意数量的读者都可以并发访问受保护的信息。然而,任何实现写入器锁定的请求(例如,通过将EnableSessionState设置为“true”)都将阻止对会话状态信息的写入和读取,直到持有写入器锁定的请求完成。

只要您尝试做的只是在页面将EnableSessionState设置为“ReadOnly”时从页面读取会话状态信息,所有读取请求都将继续进行而不会阻塞。但是,如果您尝试编写,文档并不清楚实际会发生什么。假设 ReaderWriterLock 是用于同步访问的全部内容,我的猜测是,您将无法免受覆盖、竞争条件和其他非同步访问问题的影响。

如果您打算尝试写入会话状态,请务必将EnableSessionState设置为“true”,以确保实现写入器锁定并根据需要进行同步。

我希望这有帮助!


小智 6

请参阅此博客文章:在ASP.NET中处理来自用户的多个同时请求:

  • enableSessionState="true"是默认行为,并获取会话数据的写入程序锁定.在此锁定期间,没有其他读者或作者可以获得访问权限.

  • enableSessionState="ReadOnly"获取会话数据的读者锁定.同时允许多个阅读器,但如果任何阅读器持有锁,则没有作者可以访问.遗憾的是,您对会话所做的任何更改都是请求的本地更改,对查看会话对象的其他请求不可见.如果您尝试修改"只读"会话,则不会引发任何错误,因此乍一看这种行为并不明显.

  • enableSessionState="false"没有获得任何锁定.HttpContext.Session属性最终为null,您的页面将无法访问会话数据.