静态Dictionary< T, T>跨会话共享信息.如何阻止这一切
本文关键字:信息 何阻止 共享 会话 Dictionary 静态 | 更新日期: 2023-09-27 18:11:10
在我的web项目中,我使用静态列表。假设我有两个用户(A, B)同时登录我的网站,那么这个List将存储关于A和B的一些信息,但是当我处理B List的记录时,A的List被处理,而不是B的。
谁能指出问题所在吗?请给我一些可能的解决方案来避免这个问题。我正在使用ASP。. NET c# 3.5.
提前谢谢你:)
编辑:现在我已经将数据类型从字典更改为列表,但仍然存在相同的问题…
对于特定类的所有实例来说,static
变量是相同的。所以这意味着你的网站使用完全相同的字典为用户A, B, C, D等。从本质上讲,无论哪个用户最后写入字典,您都将看到其内容。
正如其他人所建议的,您可以使用Session
变量。它们存储在服务器的内存中,并且与特定的浏览器会话(即用户)相关。
就我个人而言,我更喜欢使用ViewState
,因为它存储在对浏览器的响应中,并在页面进行回发时返回给您。这意味着服务器上的内存使用更少,视图状态在会话之间不会变化(或受应用程序重置的影响,如会话)。然而,这也意味着您存储的任何东西都是通过网络发送的,所以您永远不会想要存储信用卡号、社会安全号等东西。
这也意味着如果你要存储很多非常大的对象,你将有非常大的响应和回发(可能会减慢周期),所以你必须更加小心如何存储和存储什么。
你有几个不同的选择,你应该做一下研究,然后决定哪一个最适合你的需求。
在会话中存储值如下:
Session["mykey"] = value;
从会话中读取值如下:
Object value = Session["mykey"];
会话将在几分钟后超时,然后该值将为空。要避免这种情况,请考虑使用:
Viewstate["mykey"] = value;
Viewstate的用法与session完全相同,只是该值必须是可序列化的。视图状态被发送到客户端并再次返回,因此考虑您希望以这种方式存储的数据量。视图状态存储在"__VIEWSTATE"中,并以base64编码。
不要使用静态字典。使用会话变量来存储有关用户会话的信息。
为了获得更好的信息,你必须向我们提供更多的信息:什么记录?用什么格式?等。
当一个变量被声明为static
时,这意味着每个类(也包括web应用程序中的类)只有该变量的一个实例。
您可以将字典存储在会话中,这样每个用户都将拥有自己的字典,而代码将无法访问其他用户。
或者,如果你有时希望能够访问其他用户的信息,你可以声明它为
static Dictionary<String, Dictionary<T, T>>
,其中字符串键是唯一的用户id。