我们的网站上有几个向导样式的表单应用程序,我们在每个页面上捕获用户的信息,然后使用 Web 服务提交到后端进程。
不幸的是,我们无法在每次表单提交期间分块提交信息,因此我们必须将其存储在用户会话中,直到流程结束并同时提交所有信息。
服务器内存/sql 服务器磁盘空间的数量是我可以在用户会话中存储多少的唯一限制,还是我需要考虑其他一些事情?
编辑:该站点建立在 ASP.NET Web 表单上。
假设信息不敏感,那么您可以将信息存储在 cookie 中,这将减少需要存储在服务器端的信息量。这也将允许您通过 JavaScript 访问信息。
或者,您可以使用视图状态来存储信息,尽管这可能导致服务器和客户端之间发送大量数据,而不是我的首选解决方案。
您应该存储的会话信息量因应用程序、预期用户数量、服务器规范等而异。要给出更准确的答案,需要更多信息:)
最后,假设在整个过程中收集的信息不需要逐页收集,那么您可以将所有信息存储在数据库表中,并且只存储会话中的唯一 ID 记录。提交每个页面时,数据库记录都会更新,然后在最后一页上检索并提交所有信息。如果由于所需的数据库读取次数而需要在每个后续页面上检索以前的信息,这不是一个理想的解决方案。
您还可以拥有 1 个带有整个 html 表单的 asp 页面,并隐藏其中的一部分,直到用户填写并“提交”可见部分...
然后简单地隐藏填写的部分并显示表格的下一部分......
这在 .NET 框架中非常容易,为每个“向导步骤”使用面板并添加逻辑何时显示和隐藏每个面板。
然后,您将在一页上拥有所有数据。
如果您使用传统的 HTTP 模型(即不使用 runat="server"),您可以将数据发布到另一个 asp 页面并将发布的数据放入隐藏的表单元素中,您可以为所需的任何页面执行此操作,从而避免将任何东西放在会话变量中。
由于从性能的角度来看,在用户 Session 对象中存储大量数据是有问题的,因此 ASP.Net 在上述帖子中提到的内容之上提供了一些其他解决方法。ASP.NET Profile Provider允许您将会话相关信息保存在数据库中。您还可以使用会话状态服务器,它使用单独的服务器来存储所有会话信息。这两种情况都考虑到了如果需要使用集群或者负载均衡器,服务器仍然可以跨不同服务器识别会话信息。如果您将信息存储在 Http Session 对象中,则会遇到一个用户必须始终为该会话访问同一服务器的问题。
会话、视图状态、数据库。这些都很慢,但会完成工作。
隐藏的表单域是我最喜欢的答案。
还有其他方法可以保持状态。Cookie、弹出窗口、框架集或 iframe。