在会话中存储用户信息?

时间:2009-08-05 12:42:48

标签: c# asp.net-mvc database session

是否应存储有​​关每个请求所需用户的信息 例如。角色,电子邮件,用户名等。

在Session中

,或者可以将数据库的每个请求转到数据库吗?

由于

6 个答案:

答案 0 :(得分:3)

如果您没有计划负载平衡,那么会话状态是完全可以接受的。如果会话状态配置为使用数据库持久性,请注意,因为这样您不仅会访问数据库,而且还会产生对象序列化的开销。

如果是特定于用户的数据,那么分布式哈希表缓存系统可能会起作用。像Memcached这样的东西对此有好处,因为它们是内存缓存(性能),但是分布在多个服务器上(负载平衡),因此您可以充分利用这两个世界。

当然,如果它的数据定期更改,特别是如果您的其他系统可能在没有Web应用程序知道的情况下修改数据库,那么返回数据库可能是唯一的选择。

答案 1 :(得分:0)

我更喜欢使用加密的cookie。在繁忙的大型系统中,db调用可能会变得昂贵。会话很好,但如果您的会话后端是数据库驱动的,那也会变得昂贵。显然,使用cookie时,您必须使用身份验证令牌检查。

答案 2 :(得分:0)

这取决于你所说的“应该”。我曾经使用过几个使用会话来缓存用户信息的应用程序。该方法运行良好,减少了每个Web请求所需的数据库往返次数。

另一方面,它确实会向您的Web服务器引入状态,因此您必须坚持使用一个Web服务器,使用“病态会话”(这会使管理Web服务器更复杂)或开始存储会话信息共享数据存储(它消除了您在使用它时可能获得的任何性能提升)。

答案 3 :(得分:0)

会话数据也可以存储在数据库中,如果您的站点在Web Garden og Farm中运行,这将非常有用。如果会话正在运行InProc,则用户数据将保存在内存中,这会导致更快,但代价是可扩展性。

另一种常见的方法是将其保存为ViewState,然后在每次回发时将其发送回客户端和服务器之间,这当然会导致带宽受限,但比InProc会话要好得多。

我个人更喜欢会话状态,如果网站很小我运行InProc,如果/当网站增长时,我可以改为使用数据库。

答案 4 :(得分:0)

我将用户ID保留在Session中,并且我将许多应用程序中的活动用户记录保存在Cache中,但是我再次将所有下拉列表的内容保留在Cache中,并且我必须提供下拉列表用户时不时。

我有很多人惊呼“OMG你把它保存在Cache中??!?”但实际上,它很有效。更好的是,我在Cache中只有一个用户列表副本,而不是每个应用程序实例一个副本(100个并发用户意味着内存中可能有100个用户列表副本)。一般情况下,我会在Cache中放置任何不经常更改的内容,如果它确实发生更改,则将其强制退出Cache,因此它将在下次访问时重新加载。

答案 5 :(得分:0)

这取决于您的网站/应用。一般规则是这样的:

如果同时用户数量相当少且数据相对较小,

会话保存效果很好。

如果同时用户数较多且数据大小相对较低,则保存在Cookie 中效果很好。显然,cookie是公开可见的,因此如果它是敏感的,如电子邮件,那么它应该被加密。

如果数据大小很大,保存在数据库中效果很好。

请注意。正如其他人所说,如果您使用网络农场,那么我会忘记保存在会话中。

Martin Fowler对“企业应用程序架构模式”中的选项有很好的描述,但我不确定他是否有在线内容。

如果网站/应用需要身份验证,那么.Net具有良好的内置功能,可用于存储用户角色和唯一用户名。如果在身份验证期间保存此值,则可以通过User.IsInRole()和User.Identity.Name访问这些值。

存储在会话中会导致性能问题吗?如果您的数据大小相对较小,如电子邮件,那么我会使用会话或cookie并避免使用数据库。 运行性能测试,看看哪种方式最适合您。