【问题标题】:ASP.NET SessionASP.NET 会话
【发布时间】:2011-09-07 13:07:37
【问题描述】:

有没有办法拥有不同的会话状态?例如,在会话中存储不同的对象,但具有不同的过期时间

即:

我有两个会话对象,Session["ReportIDs"] 和 Session["IsAdmin"]

Session["ReportIDs"] - 保存正在查看的报告 ID,并且可以在当前用户查看新报告时被覆盖。 Session["IsAdmin"] - 从数据库中读取,我不想经常调用数据库来获取刷新的值,所以将其存储在会话中。但是,如果 userB 为 UserA 更改此对象的值(在管理屏幕中),则会话中的值将持续到 web.config 中设置的整个会话状态超时

有没有办法为这些会话对象设置不同的过期时间?

谢谢

【问题讨论】:

    标签: asp.net session session-state


    【解决方案1】:

    会话由每个用户维护,这意味着即使您使用相同的密钥,相同密钥下存储在 Session 中的任何内容对于每个用户来说都是不同的。也就是说,用户 A 无法覆盖用户 B 的数据。

    不同的是缓存:缓存是为整个应用程序共享的,它将/可以从一个用户覆盖到另一个用户。缓存确实具有过期和其他功能,例如当缓存对象过期时自动连接到某些事件以便可以自动刷新等。

    结论:会话是 PER USER。缓存在所有用户之间共享。

    编辑更新我的答案以正确解决 telsokari 的问题:

    在 Session 本身过期之前,Session 对象不会过期。没有办法告诉会话在一定时间后“过期”一个对象。如果这是您想要做的,您可以手动删除它们。只需挂钩应用程序中的任何事件,例如 Begin_Request 和 End_Request。

    但是我不明白您在用户注销或会话过期之前维护 Session 中的对象有什么顾虑...如果您将大量数据放入 Session 中,那么也许您不应该将这些数据缓存在第一名。如果您要放置一个可管理大小的对象,那么有什么问题?问题不应该是“我应该什么时候在 Session 中过期这个对象”?而是:“将对象存储在 Session、Cache 中或根本不存储是否有意义?”答案完全取决于您的具体情况、可用的硬件资源(内存)等。

    【讨论】:

    • 这不是我要问的。我知道会话是每个用户的,我知道缓存是应用程序级别的。每个用户对存储在 DB users 表中的 IsAdmin 都有自己的值。由于并非所有用户都是使用缓存的管理员,因此无法正常工作。我希望某些会话对象的 sessin 在与其他会话对象不同的时间过期,因此 Session["ReportID"] 可以在 60 分钟后过期,但 Session["IsAdmin"] 在 10 分钟后过期
    • @telsokari:更新了我的答案。看看吧。
    【解决方案2】:

    您不能为会话中存储的特定对象设置超时。

    可以做的是添加另一个值,例如包含日期的 LatestRealAdminCheck。然后不要直接检查 Session["IsAdmin"] 而是通过某种方法检查 LastestRealAdminCheck 以查看是否该再次访问数据库。

    另一种解决方案可能是不将 IsAdmin 值存储在用户特定的 Session 值中,而是存储在全局单例(或 Application 值)中。在这种情况下,您将需要一个用户 ID 列表以及该用户是否是管理员。

    【讨论】:

    • 应用程序级别不起作用,因为 IsAdmin 值可能会根据用户身份而有所不同,但我想“LastestRealAdminCheck”的第一个选项可能会起作用,谢谢
    • 您需要在该单例或应用程序中存储 (userid, isadmin) 的 列表。你是对的:一个值是行不通的,因为这对每个人都是一样的。
    【解决方案3】:

    会话对于每个用户都是独立的并且是沙盒的。您可以分配一次IsAdmin,它将在该用户的会话中保持活动状态。您可以随意更改ReportIDs,但仅适用于该用户。

    【讨论】:

    • 是的,我知道,我的意思是 UserB 可以更改 USERA 是否是数据库中的管理员用户。 Session["IsAdmin"] 是持有该价值的东西。此值在过期之前不会更新。这就是为什么我想为这个对象设置不同的超时时间
    猜你喜欢
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2010-10-20
    • 2011-05-15
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    相关资源
    最近更新 更多