非锁定进程内ASP.NET会话状态存储

ori*_*rip 15 asp.net session session-state

我正在使用ASP.NET的进程内会话状态存储.它专门锁定对会话的访问,这意味着顺序地向同一会话发送并发请求.

我想删除这个隐式的独占锁,因此可以同时处理每个会话的多个请求.当然,我将在适用的情况下自己同步对会话状态的访问.

我正在使用会话状态提供程序MSDN文档来编写我自己的会话状态提供程序,这个SO问题向我指出了将此实现为HTTP模块的示例代码,但代码看起来很复杂,只是为了删除锁.

我应该最终使用ASP.NET的缓存来实现会话状态,并停止使用内置会话,就像Vivek在本文中所描述的那样,但是现在我想如何删除锁定.

任何想法或示例实现?

Joe*_*Joe 12

不是你想要的答案,但我认为即使有可能,改变SessionState以这种方式工作的方式也是一个糟糕的主意.

想想那些必须维护你的代码的穷人.Session以这种方式序列化请求的事实意味着ASP.NET开发人员通常不需要过多担心线程安全.

此外,如果有人添加了碰巧使用Session的第三方组件,它会期望关于锁的常规保证 - 而且你会突然开始获得Heisenbugs.

相反,衡量性能并确定需要同时处理请求的特定区域 - 我敢打赌它们很少 - 并且只针对涉及的特定项目仔细实施自己的锁定机制 - 可能是您计划最终使用的解决方案ASP.NET缓存.


Dar*_*rov 6

如果您只是从给定页面上的会话中读取,则可以使用该Page指令:

<%@ Page EnableSessionState="ReadOnly" %>
Run Code Online (Sandbox Code Playgroud)

指示只读性质并删除独占写锁定,这将允许来自同一会话的对此页面的并发请求.

在内部使用ReaderWriter锁时,读取器锁将阻止写入器锁,但读取器锁将不会阻止读取器锁定.Writer锁将阻止所有读写器锁定.

如果您需要同时从同一页面读取和写入会话,我认为您已经找到的信息已经足够了.关于用缓存替换会话的一句话:虽然会话是可靠的,但缓存并不意味着如果你把东西放进缓存中就不能保证将其恢复.ASP.NET可能决定在内存压力较低的情况下驱逐缓存,因此在访问之前,您始终需要检查缓存中是否存在某个项目.