我有一个 ASP.NET 应用程序,它使用 Session.SessionID 来防止多个用户同时查看相同的数据。
我有一个表,其中包含一组需要处理的图像(存储在 BLOB 中)。应该只有一个用户能够同时查看相同的图像。为了实现这一点,当用户检索每条记录时,记录会使用 Session.SessionID 进行更新。此更新发生在 ReaderWriterLock 内。
我已经进行了测试以确保 ReaderWriterLock 正常工作,并且可以确认只有一个会话可以一次执行该块内的代码。
我目前的理论是两个不同的用户同时获得相同的 SessionID。此应用程序的用户可以查看他们已锁定的记录或任何未锁定的图像。
我已经修改了应用程序以在每个页面的页脚中显示 SessionID,以便如果问题再次发生,我可以检查 SessionID 值。
我在网上看到一些文章暗示 SessionID 不是唯一的,也有人说 SessionID 是唯一的。我知道 SessionID 不是永远唯一的,但是 SessionID 值对于活动会话可以被认为是唯一的吗?
我还阅读了一些建议,即应该将 Guid 存储在 Session 对象中并用作唯一 ID 而不是 Session ID。
感谢您到目前为止的回复。这是基于迄今为止的答案的澄清:
“永远锁定” - 我们通过 5 分钟的锁定超时来防止这种情况。在用户锁定图像之前,在 ReaderWriterLock 内部,我们会“清理”旧锁(解锁锁定超过 5 分钟的图像),查询以获取最旧的解锁图像,并使用更新语句“锁定”该图像图像到当前会话。
问题的一个可能原因是,如果一个用户“锁定”了一张图像,但随后离开 PC 短暂休息。如果他们在 5 分钟内什么都不做,则屏幕上的图像将被解锁并可能被另一个用户打开。我在报告问题时提到了这种情况,我确信用户一直在持续工作。
“不同的窗口/选项卡” - 我实际上并没有亲眼看到错误,但报告问题的人告诉我,这是两台不同的 PC 和登录用户的两个不同用户名。
希望现在我在页面上显示会话 ID,下次发生这种情况时,我将能够肯定地说两台机器上的会话 ID 是否相同,或者是否是其他问题。此问题在测试阶段从未发生过,因此它似乎是大量并发用户的症状。
感谢您到目前为止的回复,随着更多信息的到来,我会更新这个问题。
似乎用户没有给我完整的故事。根据接受的答案,在我们的案例中,会话 ID 是唯一的。两个用户能够同时看到相同的图像,因为用户 1 在 5 分钟的“废弃图像”解锁过程中处于空闲状态。已提高“废弃图像”超时以匹配会话超时以避免此问题。