繁体   English   中英

静态字段与会话变量

[英]Static fields vs Session variables

到目前为止,我一直在使用Session将一些变量从一页传递到另一页。 例如用户角色。 当用户登录Web应用程序时,该用户的角色ID将保留在Session中,并在应用程序的不同部分检查该角色。 我最近开始思考为什么不使用静态成员。 我可以将相同的信息存储在静态字段中,并在应用程序中的任何位置(包括该静态字段所在的名称空间的任何位置)轻松访问它。我知道使用Session变量有时很方便,例如:

  1. 任何类型的数据都可以存储在Session中。 但是必须将其强制转换。但是静态字段仅接受具有正确数据类型的数据。
  2. 会话变量将在一定时间后到期,这是我们在许多情况下需要的行为。

除了以上所述,还有其他原因为什么我不应该使用静态字段来存储数据并使数据无处不在?

不,为此使用静态变量不是可行的方法:

  • 如果您的AppDomain被回收,则所有静态变量都将被“重置”
  • 静态变量不会水平扩展-如果您对应用程序进行负载平衡,则碰到一台服务器的用户然后另一台服务器将看不到第一台服务器的静态变量中的数据存储
  • 最重要的是,静态变量将由对该服务器的所有访问权限共享...根本不会以每个用户为基础...但是从您的描述中,您不希望用户X查看用户Y的信息。

从根本上讲,您有两种选择可以在应用程序中传播信息:

  • 将其保留在客户端,因此每个请求都提供来自先前步骤的信息。 (使用大量信息可能会变得很笨拙,但是对于简单的情况可能很有用。)
  • 将其保留在服务器端,理想情况下以某种持久性方式(例如数据库)保留,客户端提供会话标识符。

如果您可以使用负载平衡使所有用户都访问同一服务器,并且如果您不介意AppDomain回收1或服务器宕机时会话丢失,则可以将其保存在内存中,并以会话ID为键... 不过要小心。


1 ASP.NET中可能存在某种机制来解决此问题,将会话信息从一个AppDomain传播到另一个-我不确定

他们是两件事。

  • 会话可以在进程外使用(对于负载平衡很重要)
  • 由于其进程外功能,会话可以更持久。
  • ASP.Net自动管理会话并发。
  • 对静态变量的访问需要手动同步。
  • 静态对于整个应用程序域都是全局的。 如果为一个用户设置静态字段/属性的值,则所有用户将获得相同的值。 这不是您方案中的预期行为。

任何类型的数据都可以存储在Session中。 但是必须将其强制转换。但是静态字段仅接受具有正确数据类型的数据。

使用助手类来抽象Session值通常是有帮助的。 这可以提高可测试性,还可以让您强烈地键入属性并在类的内部进行转换。

例:

public List<int> UserRoles
{
    get
    {
        // optionally check that the value is indeed in session, otherwise this 
        // will throw
        return (List<int>)Session["UserRoles"];
    }
}

也可以看看:

你忘了一件事(我认为)

应用程序的所有用户的静态数据都相同,而会话为“每用户”。

因此,对于您的“用户角色”方案,我希望得到有趣的结果;)

静态字段将在所有用户之间共享。
在Web环境中,您将有多个线程一起运行。

更新任何静态成员将需要适当的并发控制。 做错了,这会大大降低您的网站性能。

可以将会话移出进程,并在整个Web服务器场中共享。

即使您的应用服务器崩溃了,proc会话也会存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM