【问题标题】:Maintaining state in Asp.Net MVC website在 Asp.Net MVC 网站中维护状态
【发布时间】:2013-01-27 01:10:04
【问题描述】:

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

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

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

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

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

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

谢谢,
编辑。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4


    【解决方案1】:

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

    【讨论】:

    • 这似乎是一个很好的解决方案,但现在我不想使用 Claims。谢谢!
    【解决方案2】:

    (1) 使用Sql Server 存储会话状态

    (2)使用Memcached as a Session State Provider

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

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

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

    • 在 cacheKey 中包含用户的会话开始日期时间,并在条目不再新鲜时自动过期
    • 在用户开始新会话时清除所有潜在条目

    【讨论】:

    • ASP.NET 还附带了一个状态服务器(Windows 服务),可以在场中的服务器之间进行配置。
    • 太好了,ServiceStack 看起来是个不错的解决方案。它看起来很简单,我可以使用 InMemoryCache 来替换 Session。
    • 顺便说一句,有一个会话 cookie 存储每次登录的会话标识符。所以我可以通过 Session 对象检索它并将其用作我的自定义缓存提供程序的标识符,对吧?
    猜你喜欢
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多