2011-09-07 44 views
1

有没有办法让不同的会话状态?作中,有存储在会话不同的对象,但具有不同的到期ASP.NET会话

即:

我有两个会话对象,会话[“ReportIDs”]和会话[“IsAdmin”]

会话[” ReportIDs“] - 保存正在查看的报告ID,并且可以在当前用户查看新报告时覆盖。 会话[“IsAdmin”] - 从数据库中读取,我不想不断地调用数据库以获取刷新值,以便将其存储在会话中。但是,如果userB为UserA更改此对象的值(在管理员屏幕中),会话中的值将一直保留,直到在web.config中设置的整个会话状态超时为止。有没有一种方法可以为不同这些会话对象?

感谢

回答

1

的会话是各自独立为每个用户和沙盒。您可以分配IsAdmin一次,并且它将为该用户的会话保持活动状态。您可以尽可能多地更改ReportIDs,但它只会针对该用户。

+0

是的,我知道,我的意思是UserB可以改变USERA是否是管理员用户或不在数据库中。会议[“IsAdmin”]是持有这个价值。该值在到期前不会更新。这就是为什么我想为此对象设置不同的超时时间 – telsokari

2

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

可以做的是添加另一个值,比如说LatestRealAdminCheck持有一个日期。然后不要直接检查会话[“IsAdmin”],但通过检查LastestRealAdminCheck以查看是否该再次点击数据库的某种方法。

另一种解决方案可能是不存储在用户特定的会话值IsAdmin值,但在一个全局单(或应用程序的值)。在这种情况下,您需要 user-id的列表以及该用户是否为管理员。

+0

应用程序级别将无法正常工作,因为IsAdmin值可能因用户的不同而不同,但我猜“LastestRealAdminCheck”的第一个选项可能会起作用 谢谢 – telsokari

+0

您将需要在该单例或应用程序中存储(userid,isadmin)的**列表**。你是对的:一个单一的价值观将不起作用,因为这对每个人都是一样的。 –

2

每个用户都维护会话,这意味着即使您使用相同的密钥,在同一个密钥下的会话中存储的每个用户也会有所不同。换句话说,用户A不能覆盖用户B的数据。

不同的是高速缓存:高速缓存是为整个应用共享的,它可以/可以从一个用户覆盖到另一个用户。高速缓存确实有过期和其他功能,如挂钩的一些事情时,自动缓存的对象过期,以便它可以自动刷新等

结论:Session是每用户。缓存在所有用户之间共享。

编辑更新我的回答对妥善解决telsokari的问题:

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

但我不明白,直到用户注销或会话过期...如果你是把大量的会话数据,那么也许你不应该缓存的数据你怎么看在会话保持关注对象首先。如果您要放置可管理尺寸的对象,那么问题是什么?这个问题不应该是“我应该在Session中何时过期”?而是:“将对象存储在Session中,缓存中还是根本不存在?”答案完全取决于你的具体情况,可用的硬件资源(内存)等等。

+0

这不是我所问的。我知道会话是每个用户,我知道缓存是应用程序级别。每个用户对存储在DB用户表中的IsAdmin都有自己的值。由于不是所有的用户都是管理员使用缓存不会工作。我希望某些会话对象的会话在不同的时间到期,因此会话[“ReportID”]可能在60分钟后过期,但会话[“IsAdmin”]在10分钟后过期 – telsokari

+0

@telsokari:更新我的答案。看一看。 – Icarus