静态字典<t,t>跨会话共享信息。如何阻止这个?</t,t>

时间:2011-10-12 19:19:18

标签: c# .net-3.5

在我的网站项目中,我使用的是静态列表。所以假设我有两个用户(A,B)同时登录我的网站,那么这个List将存储一些关于A和B的信息。但是当我处理B List的记录时,A的列表正在获得处理而不是B的。

有人可以指出问题吗?还请建议我一些可能的解决方案来避免这个问题。

我正在使用ASP.NET C#3.5。

提前谢谢你:)

修改

现在我已经将数据类型从Dictionary更改为List,但仍然存在同样的问题......

5 个答案:

答案 0 :(得分:1)

static变量是特定类的所有实例的相同的变量。所以这意味着您的网站使用完全相同的字典用于用户A,B,C,D等。基本上,无论用户最后写入字典的是哪个内容您将看到的内容,无论哪个用户正在寻找。

正如其他人所建议的那样,您可以使用Session个变量。它们存储在服务器的内存中,并与特定的浏览器“会话”(即用户)相关。

就个人而言,我更喜欢使用ViewState,因为它存储在对浏览器的响应中,并在页面进行回发时返回给您。这意味着服务器上的内存使用量减少,视图状态在会话中不易变(或者受到会话等应用程序重置的影响)。然而,这也意味着无论您存储的是什么,都是通过网络发送的,因此您永远不会想要存储信用卡号码,SSN等信息。

这也意味着如果你要存储很多非常大的对象,你将会有一个非常大的响应和回发(可能会减慢周期),所以你必须更加小心你的方式和内容存储。

对于您来说,这是一些不同的选择,您应该进行研究并确定哪种方案最适合您的要求。

答案 1 :(得分:1)

在会话中存储值如下:

Session["mykey"] = value;

从会话中读取值就像:

Object value = Session["mykey"];

会话将在几分钟后超时,然后该值将为null。 为避免这种情况,请考虑使用:

Viewstate["mykey"] = value;

Viewstate的使用方式与会话完全相同,只是该值必须是可序列化的。 视图状态将发送到客户端并再次返回,因此请考虑以这种方式存储的数据量。视图状态存储在“__VIEWSTATE”中,并以base64编码。

答案 2 :(得分:0)

不要使用静态字典。使用会话变量存储有关用户会话的信息。

为了获得更好的信息,您必须向我们提供更多信息:什么记录?用什么格式?等

答案 3 :(得分:0)

当一个变量被声明为static时,这意味着每个类只有一个该变量的实例(这也包括Web应用程序中的类)。

因此,静态变量不依赖于用户。如果您需要存储特定于用户的数据,请考虑使用Session variable

答案 4 :(得分:0)

您可以将字典存储在会话中,这样每个用户都可以拥有自己的字典,并且代码无法访问其他用户。

或者,如果您有时希望能够访问其他用户的信息,则可以将其声明为

static Dictionary<String, Dictionary<T, T>>

其中字符串键是唯一的用户ID。