全局范围内的.NET会话替代方案

时间:2011-02-24 18:04:47

标签: c# asp.net asp.net-membership scope

快速提问:是否存在“每用户”数据存储对象(类似于Session),我可以将数据存储在全局范围内(类似于HttpRuntime.Cache )?几乎好像SessionHttpRuntime.Cache有一个孩子。

完整背景:我有一个最初为单个线程编写的ASP.NET网站。现在我对其进行了更改,以便某些操作将生成后台线程,浏览器会轮询服务以获取状态更新。

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

我知道HttpRuntime.Cache但是这需要微观管理来分割用户并在会话过期的同时使其过期。另一方面,Session会在我想要的时间自动使这些内容过期,并且已被SqlMembershipProvider等内容使用。

我的问题是,是否存在与Session类似但存在于全局范围内的东西?

3 个答案:

答案 0 :(得分:3)

我认为你不需要开箱即用。我会做以下事情:

  1. 使用应用程序缓存
  2. 将密钥设为用户ID或唯一标识符
  3. 在用户的值中存储Dictionary或某个对象列表。用它来存储您需要的所有数据。
  4. 如果您认为可能与用户唯一标识符(例如域名等)发生冲突,请考虑在用户ID上添加一些内容
  5. 确保在缓存数据上设置类似于会话的到期时间(例如滑动)

答案 1 :(得分:3)

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

请参阅此blog post,了解如何从多个线程安全地访问HttpContext对象。

答案 2 :(得分:3)

没有

因为当应用程序池重新启动所有后台活动时,我建议考虑将用户的状态移动到您自己的数据库或外部存储。遗憾的是,您将失去自动会话管理功能(滑动到期),但如果您需要后台活动,它将更好地工作 - 即,如果稍后需要,您将能够将您的活动从IIS进程移出以分离进程/机器。