代码之家  ›  专栏  ›  技术社区  ›  Andy Rose

用户会话对象中可以/应该存储多少数据?

  •  8
  • Andy Rose  · 技术社区  · 16 年前

    我们的网站上有几个向导样式的表单应用程序,在这些应用程序中,我们从每个页面上的用户那里捕获信息,然后使用Web服务提交到后端流程。

    不幸的是,我们不能在每次表单提交期间以块形式提交信息,因此我们必须将其存储在用户会话中,直到流程结束,然后同时提交所有信息。

    服务器内存/SQL Server磁盘空间的数量是我在用户会话中可以存储多少的唯一限制,还是需要考虑其他一些问题?

    编辑:该网站基于ASP.NET Web窗体。

    5 回复  |  直到 15 年前
        1
  •  3
  •   Toby Mills    16 年前

    假设信息不敏感,那么您可以将信息存储在一个cookie中,这样可以减少存储服务器端所需的信息量。这还允许您通过JavaScript访问信息。

    或者,您可以使用viewstate来存储信息,尽管这会导致在服务器和客户机之间发送大量数据,而不是我的首选解决方案。

    您应该存储的会话信息量因应用程序、预期用户数、服务器规格等的不同而变化很大。要给出更准确的答案,需要更多信息:)

    最后,假设在整个过程中收集的信息不是逐页收集的,那么您可以将所有信息存储在数据库表中,并且只在会话中存储记录的唯一ID。提交每一页时,数据库记录将更新,然后在最后一页上检索并提交所有信息。如果由于所需的db读取次数而需要在每个后续页面上检索以前的信息,那么这不是一个理想的解决方案。

        2
  •  2
  •   mmattax    16 年前

    您还可以拥有一个包含整个HTML表单的ASP页面,并隐藏其中的一部分,直到用户填充并“提交”可见部分…

    然后简单地隐藏填好的部分并显示表单的下一部分…

    这在.NET框架中非常简单,可以为每个“向导步骤”使用面板,并在显示和隐藏每个面板时添加loggic。

    然后您将在一个页面上拥有所有数据。

        3
  •  0
  •   mmattax    16 年前

    如果您使用传统的HTTP模型(即不要使用runat=“server”),您可以将数据发布到另一个ASP页面,并将发布的数据放入隐藏的表单元素中,您可以对所需的许多页面执行此操作,从而避免在会话变量中放置任何内容。

        4
  •  0
  •   amitm    16 年前

    由于从性能的角度来看,在用户会话对象中存储大量数据是有问题的,ASP.NET除了在上面的文章中提到的之外,还提供了一些其他的解决方法。 ASP.NET Profile Provider 允许您在数据库中保留与会话相关的信息。您也可以使用 Session State Server 它使用单独的服务器存储所有会话信息。这两种情况都要考虑到,如果需要使用集群或负载平衡器,服务器仍然可以跨不同的服务器识别会话信息。如果将信息存储在HTTP会话对象中,则会遇到这样的问题:对于该会话,一个用户必须始终访问同一个服务器。

        5
  •  0
  •   Axl    15 年前

    会话、视图状态、数据库。这些都很慢,但能完成任务。

    隐藏的表单字段是我最喜欢的答案。

    还有其他方法来保持状态。cookies、弹出窗口、框架集或iframes。