在Asp.Net MVC网站上维护状态

时间:2013-02-11 20:43:21

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

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

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

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

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

你还有其他建议吗? 我想从目前的简单开始,但保持设计为未来更先进的解决方案做好准备。

任何最佳做法或代码/设计建议都将受到赞赏。

谢谢,
EDI。

2 个答案:

答案 0 :(得分:3)

(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中包含用户的会话开始日期时间,并在不再新鲜时自动过期条目
  • 在用户开始新会话时清除所有可能的条目

答案 1 :(得分:0)

如果您使用的是.NET 4.5并且依赖于您保留在用户身上的信息的类型和数量,您可能希望使用claims来存储有关该用户的信息。在.NET 4.5中,所有Principal都从ClaimsPrincipal继承。 ClaimsPrincipal已使用声明来存储用户名,角色和其他信息。您可以创建自己的service to transform claims,这样您就可以向Principal用户添加其他信息。

相关问题