Asp.Net MVC 会话 vs. 缓存

3
我们一直在开发asp.net mvc应用程序。只要用户登录,我们就必须保留一些特定于用户的信息。那么我有什么选择呢?缓存是整个站点所有用户共享的。Session似乎是一个选项,但我已经附加了WebForms以显示Crystal Reports,而WebForms和MVC使用的Session对象不同:Mvc使用HttpSessionStateBase,而WebForms使用HttpSessionState。
我应该在会话中保存多少信息(每个用户都有一个大约30个整数的数组)?我应该将其保存在会话中还是应该使用会话和缓存的组合?
编辑:我创建了一个SessionService,它接受HttpSessionStateBase作为参数,并从Mvc中调用它:
SessionService _service = new SessionService(HttpContext.Session);

它返回HttpSessionStateBase,但正如Darin所建议的那样,它是抽象类,因此可能正在使用SessionStateWrapper实现。在Web表单方案中,我正在使用类似以下内容的东西

HttpSessionStateWrapper Session = new HttpSessionStateWrapper(HttpContext.Current.Session);
            SessionService _SessionRepository = new SessionService(Session);
3个回答

9

在会话中为每个用户存储30个整数是可以的。

但是现实情况是,使用缓存可能会遇到需要注意的问题:

  • 会话状态 - 除非使用状态服务器或 SQL Server - 将是易失性的,并且在回收时可能会丢失。此外,如果将您的站点移动到多个服务器,则必须在所有服务器上填充会话(如果使用易失会话)。
  • 许多 ASP.NET 特性(例如身份验证)基于 cookie 而非 session。您需要知道它们不会协同工作。例如,如果使用表单身份验证并重新启动站点或回收应用程序,则用户仍然保持身份验证,而您已经丢失了所有会话信息。

+1 不错的简短代码。我想将信息保存在会话中,这样我就不必在每个页面上重新计算它们,但是如果我在会话中找不到任何内容,我将从数据库中获取它们,使用它们并将其放入会话以供将来使用。 - Muhammad Adeel Zahid
1
这就是我的意思!不要假设它已经存在。每个用户30个整数根本不算什么。即使在一个庞大的网站上,你甚至可以为每个用户存储几 KB(可能高达50-100KB)。 - Aliostad

4
会话似乎是一个选项,但我已经添加了用于显示水晶报表的WebForms,而WebForms使用的Session对象与MVC不同:Mvc使用HttpSessionStateBase,而WebForms使用HttpSessionState。
HttpSessionStateBase是一个抽象类,其实现只是原始HttpSessionState对象的包装器。因此,只要您在同一应用程序中保持不变,MVC和WebForms之间的会话就完全相同,并且您将能够使用它共享数据。因此,在您的情况下,会话似乎是一种正确的方法来保存数据。

@敢问一句!如果所有的缓存变量都在一个actionresult中创建,那么输出缓存是否可以成为替代方案? - Tassadaque
@Muhammad Adeel Zahid,你的方法是正确的。在WebForms场景中使用HttpSessionStateWrapper来包装会话是正确的。 - Darin Dimitrov
1
@Tassadaque,不,这里我们正在讨论特定用户信息。缓存是所有用户共享的。 - Darin Dimitrov

0

在此情况下使用session没有问题,是完全可行的。


这似乎是一条注释,而不是答案。 - JoshYates1980

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接