3

我正在尝试将我的 asp.net mvc4 应用程序(它大量使用 SessionState)转换为无状态应用程序。我知道我可以将此信息存储在数据库中,并且打算这样做。

不过,我的问题是关于我的特定架构。我的应用程序有一个主“页面”,由许多局部视图面板组成,每个面板都有可以影响其他面板的操作。到目前为止,我一直在做的是将 viewModel 的整个状态(许多相互关联的 EF 列表集合和“记录”对象)存储在会话中,并且运行良好。除非会话随机终止。

因此,我需要将这些数据从会话中取出,并放入数据库中,以便我可以在需要时重建数据。我担心的是,如果我将信息存储在数据库中,在屏幕上执行的每个操作都可能影响 3-5 个不同的面板,每个面板都有自己的状态更新,每次交互至少需要 10 次往返数据库!

我可以使用哪些策略来使这个想法更具可扩展性?

额外信息

这里所讨论的视图是一种 POS 购物车系统。有用于选择事件、选择/添加项目到购物车、编辑购物车项目、选择联系人、编辑联系人、显示购物车项目、显示购物车“小计”的面板,最后还有一个带有 [结帐] 按钮的面板。

选择新事件将更改可用项目列表。选择要添加到购物车的项目将更改购物车项目列表、小计以及结帐面板。编辑购物车项目也是如此。

主要关心的是如何从丢失的会话中恢复,因为我发现内置的 asp.net 会话代码太不可靠了。我的测试人员遇到了会话超时的问题,然后我的应用程序没有任何类型的恢复过程。当它安装在 1500 个站点上时,每个站点平均有 10 个用户,它将成为会话丢失问题的瘟疫,我需要在它成为一个真正的问题之前解决这个问题。

我同意我不会成为无国籍人……匆忙中用词的错误选择。我只是试图将该状态转换为一种我可以依赖的形式来克服会话失败。我目前的主要想法是继续使用会话作为 viewModel 数据的本地缓存,但是如果会话丢失以某种方式丢失,则有一个后备操作可以从 DB 重建 viewModel。

4

2 回答 2

1

您不一定要使用数据库来存储(听起来像)只需要在短期内持久化的数据。

如果对其他部分的这些更改仅与当前“主视图”的上下文相关,那么我建议使用 jQuery AJAX 发送请求、解析响应 JSON 并更新其他视图。如果您还没有相关知识,很容易找到有关 jQuery AJAX 和 ASP.NET MVC 的教程:

http://www.codeproject.com/Articles/41828/JQuery-AJAX-with-ASP-NET-MVC

这样,您无需进行大量往返。如果更改需要在当前视图的上下文之外持久化,则对数据库进行一次往返以执行更新,然后从 AJAX 调用的内存响应中简单地更新所有其他部分。

当您已经拥有内存中所需的所有信息时,您不需要多次从辅助存储中读取。只做一次阅读和写作。

于 2013-05-02T19:35:29.843 回答
0

我决定采用混合方法。我仍在使用会话,但我正在构建一个数据库“恢复”选项,这样如果会话部分丢失,数据库将能够提供无缝重建会话所需的值。

到目前为止,似乎运作良好。

于 2013-06-18T15:12:40.060 回答