2013-02-11 78 views
2

我目前正在设计一个基于MVC的新网站,我想知道什么是管理状态的正确方法。
国家应该包含用户ID和用户信息的一些结构,而他在(通过HTTP请求)在Asp.Net MVC网站维护状态

的重要标准,真实记录应在用户的整个会话期间保持:
1)支持的可扩展性
2)性能

简单的方法是使用会话对象,但它不支持可伸缩性。如果会话期间不同的请求通过不同的IIS服务器,会话将不会保留。尽管我听说过负载均衡工具可以通过同一台机器将单个会话的所有请求发送出去,但我不确定依赖它是否是一个好习惯(不是吗?)

另一种选择是我已经读过,将状态数据保存在运行RAM数据库的特殊状态服务器中(如Cassandra for Linux或Redis for Windows)。但在我看来,在这个发展阶段,这种做法过于夸张。

你有什么建议吗? 我想从现在简单的事情开始,但在将来继续为更高级的解决方案做好准备。

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

谢谢,
Edi。

回答

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用户会话的开始日期时间,当他们不再新鲜
  • 清除对用户的所有潜在条目时,他们开始一个新的会话自动过期项
+0

ASP.NET还附带可在服务器场中的服务器上配置的状态服务器(Windows服务)。 – GalacticCowboy 2013-02-11 21:08:15

+0

太棒了,ServiceStack看起来很不错。它看起来很简单,我将能够使用InMemoryCache来替换会话。 – Edi 2013-02-11 21:24:12

+1

顺便说一句,有一个会话cookie,它存储每次登录的会话标识符。所以我可以通过Session对象检索它并将其用作我的自定义缓存提供程序的标识符,对吗? – Edi 2013-02-11 21:27:32

0

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

+0

这似乎是一个很好的解决方案,但现在我不想使用索赔。谢谢! – Edi 2013-02-11 21:28:47