我最近发现,当您将页面设置为只读会话并且您正在使用inproc(内存)会话存储时,该会话仍然可以在该页面上写入,并且不是真正的只读。进程外会话存储确实尊重只读设置。
当页面设置为只读并使用inproc模式时,您是否仍然可以获得没有会话锁争用的好处?在readonly和inproc中,具有相同会话ID的多个同时请求是否必须等待会话锁释放?
答案 0 :(得分:6)
请参阅此博文:Handling multiple simultaneous requests from a user in ASP.NET:
enableSessionState="true"
是默认行为,并获取会话数据的写入程序锁定。在此锁定期间,没有其他读者或作者可以获得访问权限。
enableSessionState="ReadOnly"
获取会话数据的读者锁定。同时允许多个阅读器,但如果任何阅读器持有锁,则没有作者可以访问。遗憾的是,您对会话所做的任何更改都是请求的本地更改,对查看会话对象的其他请求不可见。如果您尝试修改"只读"会话,所以这种行为乍一看并不明显。
enableSessionState="false"
没有获得任何锁定。 HttpContext.Session属性最终为null,您的页面将无法访问会话数据。
答案 1 :(得分:3)
BuzzAnn,
Microsoft关于该主题的文档表明,将页面级会话状态模式设置为“ReadOnly”可以防止并发尝试写会话状态信息(它们将排队并串行处理) ,但允许多个读者。请参阅“同步对会话状态的访问”部分:
http://msdn.microsoft.com/en-us/library/aa479041.aspx
当页面的 EnableSessionState 属性设置为“ReadOnly”时,每个页面请求都会尝试让读者锁定状态信息。在标准的ReaderWriterLock语义中,任意数量的读者都可以同时访问受保护的信息。但是,任何实现写入锁定的请求(例如,通过 EnableSessionState 设置为“true”)都会阻止写入和读取会话状态信息,直到请求保持为止作家锁完成。
只要您尝试做的就是在 EnableSessionState 设置为“ReadOnly”时从您的页面读取会话状态信息,所有读取请求将继续进行而不会阻塞。但是,如果您尝试编写,则文档不清楚实际会发生什么。假设ReaderWriterLock是用于同步访问的全部内容,我猜测您将无法防止覆盖,竞争条件和其他非同步访问问题。
如果您要尝试写入会话状态,请务必将 EnableSessionState 设置为“true”,以确保实现编写器锁定并根据需要进行同步。
我希望这有帮助!