2

我目前正在设计一个基于 MVC 的新网站,我想知道管理状态的正确方法是什么。
状态应该包含 userId 和用户信息的一些结构,并且应该在用户登录的整个会话期间保持(跨 http 请求)

重要标准:
1) 支持可扩展性
2) 性能

最简单的方法是使用 Session 对象,但它不支持可伸缩性。如果会话期间的不同请求通过不同的 IIS 服务器,则不会保留会话。虽然我听说过负载平衡工具通过同一台机器路由单个会话的所有请求,但我不确定依赖它是否是一个好习惯(不是吗?)

我读过的另一个选择是将状态数据保存在运行 RAM DB 的特殊状态服务器中(如 Linux 的 Cassandra 或 Windows 的 Redis)。但在我看来,在开发的这个阶段有点矫枉过正。

你有什么其他的建议?我想从现在简单的东西开始,但要为将来更高级的解决方案做好准备。

任何最佳实践或代码/设计建议将不胜感激。

谢谢,
艾迪。

4

2 回答 2

3

(1)使用Sql Server存储Session State

(2)使用Memcached 作为 Session State Provider

(3)在外部缓存提供程序上使用缓存来制作您自己的解决方案:考虑使用类似ServiceStack 缓存框架的东西。使用它,您可以使用 Redis、Memcached、Azure 或 AWS 来处理缓存。

接下来,创建一个 KeyFactory 来处理特定项目的密钥生成。项目键将包括 UserId(您将始终从FormsAuthenticationUserId 获得(假设您正在使用FormsAuthentication)。然后将用户的任何 Session 数据存储在缓存中。使用这种方法,您使用 Caching 代替Session,并且缓存可以在多个服务器之间共享。

注意:您可以有不同的方法来清除用户在开始新会话时的数据。潜在的方法包括:

  • Include the user's session start dateTime in the cacheKey, and auto-expire entries when they are no longer fresh
  • Clear out all potential entries for a user when they begin a new session
于 2013-02-11T20:57:09.587 回答
0

如果您使用的是 .NET 4.5 并且取决于您为用户保留的信息的类型和数量,您可能希望查看使用声明来存储有关用户的信息。在 .NET 4.5 中,所有 Principal 都从ClaimsPrincipal继承。ClaimsPrincipal 已经使用声明来存储用户名、角色和其他信息。您可以创建自己的服务来转换声明,这将允许您向 Principal 用户添加其他信息。

于 2013-02-11T20:55:21.047 回答