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