如何使用C#在网站上存储用户输入的值?

时间:2009-09-03 10:33:21

标签: c# global-variables

我目前正在开发一个流量很大的网站。该网站只有4-5页,但我需要将第1页上选择的值传递到第2页,其中存储更多值,依此类推,直到用户到达第5页,其中所有值都传递给第三方系统使用XML。

目前,我使用一个字典对象,其中大约有20个密钥存储在一个会话对象中,以保存不同页面中的值。我这样做是因为有些值不仅仅是'name'或'age'值这样的简单值,而且可能很复杂,比如在第2页上保存XML调用的结果数据集。

我到处都读过全局变量都不好所以我想知道在这个例子中是否有替代方法使用Sessions?我不能使用数据库来保存这些值,因为某些值需要存储(即我的变量不仅仅是字符串/整数)。如果我要使用全局静态变量,我如何确保全局变量对每个用户都是唯一的?

感谢您的想法。

**编辑1 ** 我将当前会话存储在ASP.NET会话状态而不是inproc中。我只想弄清楚我在做什么是不好的做法,或者只是普遍认为是一种好的做事方式。例如,在第二页上,我获得了一个XML结果,我将其作为数据集存储在我的会话中,以便在我的网站的第3/4页上使用。我应该以另一种方式存储/传递此信息吗?

3 个答案:

答案 0 :(得分:1)

  

我无法使用数据库来保存这些内容   因为某些方式的价值观   价值需要存储(即我的   变量不仅仅是字符串/整数。)

你真的可以。您可以序列化对象图并将其作为二进制列存储在数据库中 此外,您可以开箱即用并使用SessionState 这是一篇关于如何Store Session State in Sql Server的文章。

所以我建议使用Session,但将会话状态存储在数据库中。

答案 1 :(得分:0)

会话是正确的选择。 “全局变量不好”这个论点很好,但是它描述的是全局变量,而不是会话变量,并且与您如何组织在应用程序中的方法之间传递的数据有关。在页面之间存储数据只能通过以下三种方式之一完成:

  1. 将数据存储在隐藏字段 Cookie 中(因此,对于每个网页请求,所有内容都会来回传递)。你可以通过序列化你的XML和其他花哨的数据来做到这一点,但这听起来像一个糟糕的主意。
  2. 将数据存储在数据库平面文件中。这是一个不错的主意,但您仍需要自己进行序列化工作。
  3. 将数据存储在会话中。这与选项#2完全相同,只是C#正在为您进行序列化,然后将结果保存在一个平面文件中。
  4. 您无需进行任何工作即可将一个用户的数据与另一个用户的数据分开。每个访问者都会获得一个唯一的会话,您存储在那里的数据将永远不会应用于其他用户(不包括恶意攻击,例如被劫持的会话)。

答案 2 :(得分:0)

我认为会话是放置与“会话”相关的内容的合适位置。 是真的,过度使用/滥用会话可能会让你过度消耗内存,但替代方案可能会慢一点,只是依赖。此外,如果您使用SessionStateService或在SQL Server中存储Session,则在每个请求上序列化/反序列化会话对象时会减慢。

您可以使用ViewState,但这意味着所有数据都将被序列化为HTTP表单,这意味着它将在后续请求中来回传递。另外,我认为ViewState会从一个ASP.NET表单中删除到另一个表单,所以除非你在同一个表单上,否则它将不起作用。

您可以将数据存储在数据库中。一种方法是让Session使用SQL Server。如果我使用数据库来解决这个问题,我不认为我会在SQL Server中使用会话,只是因为如果你自己存储它,那么你可以恢复以前输入的数据。