2011-02-24 114 views
3

快速的问题:是否有“每用户”数据存储对象(类似于Session),我可以存储在全球范围内(类似于HttpRuntime.Cache)数据?几乎就好像SessionHttpRuntime.Cache有个孩子。.NET会话替代在全球范围

全文背景:我有一个ASP.NET网站,最初是为单个线程编写的。现在我改变了它,以便某些操作产生后台线程,浏览器轮询服务以获取状态更新。

我遇到的问题是某些数据片段存储在HttpContext.Session []对象(例如成员身份验证令牌)中。这些数据片段必须对每个用户都是唯一的,并且可以通过后台线程访问。会话不可用于后台线程。

我知道HttpRuntime.Cache但这需要微观管理来细分用户,并在会话过期的同时过期。另一方面,Session会在我想要的正确时间自动过期,并已被SqlMembershipProvider之类的事情所使用。

我的问题是,有什么行为类似于会议,但存在于全球范围内?

+2

+1为sessioncache婴儿。 – jlafay 2011-02-24 18:24:04

+0

@jlafay你居然让我LOL – Kelsey 2011-02-24 18:25:59

回答

3

我不认为有什么像你需要开箱即用。我虽然做到以下几点:

  1. 用户应用程序缓存
  2. 使钥匙的用户ID或唯一标识符
  3. 存放在用户的价值Dictionary或某个对象名单。使用它来存储您需要的所有数据。
  4. 考虑用户ID的所有预先考虑的东西,如果你认为有可能是与用户唯一标识符(例如域名等)
  5. 冲突务必设置到期类似的会话缓存的数据(例如滑动)
+0

似乎有可能会有一些危险 – Jeff 2011-02-24 18:48:23

+0

@Jeff危险?你能否详细说明。如果你有权访问'Cache',这个方法应该可以做你需要的一切。这只是一个混合动力。我不会推荐使用Alexei在评论中提到的会话复制方法。 – Kelsey 2011-02-24 21:13:21

+0

Ooops。我开始写这个评论,但从来不打算发送它。我甚至没有意识到它被张贴,直到我得到这个回应。这就是为什么它没有任何意义。起初,我很关心范围,但我自己做了一些事情。抱歉! – Jeff 2011-02-24 22:07:46

3

尝试将HttpContext.Current对象传递给后台线程上的方法。您应该能够通过currentContext.Session假设currentContext从后台线程访问会话中传递的HttpContext参数。

看到这个blog post如何安全地从多个线程访问的HttpContext对象。

+0

请求结束后上下文不可用(如OP情况下)。 – 2011-02-24 18:19:48

+0

好博文!当我第一次阅读你的回复时,我很兴奋能够通过上下文,但是现在在博客文章之后,我将不得不多花一点时间思考它是否真的安全以及我需要什么。 – Jeff 2011-02-24 18:26:20

3

因为当应用程序池重新启动所有backgound活性死,我建议考虑移动用户的状态,以自己的数据库或外部存储。不幸的是,你将失去自动会话管理的优点(滑动到期),但是如果你需要背景活动,它会更好地工作 - 即你可以将活动从IIS进程移出,以便在稍后需要时分离进程/机器。

+0

我不担心应用程序重新启动时丢失数据。外部存储会给我另一种访问httpcontext之外的会话数据的方式。 – Jeff 2011-02-24 18:31:56

+0

在这种情况下,我会简单地克隆Session的内容(因为它是字符串到对象字典)并将其传递给工作线程。请注意,如果会话状态中的内存状态对象不是会话状态中的数据副本(与SQL /会话服务状态不同),请小心不要更改工作线程中的数据。 – 2011-02-24 19:02:54