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