到目前为止,我一直在使用 Session 将一些变量从一个页面传递到另一个页面。例如用户角色。当用户登录到 Web 应用程序时,用户的角色 ID 保存在 Session 中,并在应用程序的不同部分检查该角色。我最近开始思考为什么不改用静态成员。我可以将相同的信息存储在静态字段中,并在我的应用程序中的任何位置轻松访问它(以及包含该静态字段所在的 namespace 的任何位置。)我知道使用 Session 变量有时会很方便,例如:
- 任何类型的数据都可以存储在 session 中。然而,它必须被强制转换。但是静态字段只接受具有正确数据类型的数据。
- session 变量将在一定时间后过期,这是我们在许多情况下需要的行为。
除了上述之外,还有什么其他原因不应该使用静态字段来存储数据并使其随处可用吗?
最佳答案
不,为此使用静态变量不是要走的路:
- 如果您的 AppDomain 被回收,您所有的静态变量都将被“重置”
- 静态变量不会水平扩展——如果您对您的应用程序进行负载平衡,一个用户访问一个服务器然后另一个服务器将看不到第一台服务器的静态变量中的数据存储
- 最重要的是,静态变量将由对该服务器的所有访问共享...它根本不会基于每个用户...而根据您的描述,您不会'想让用户X看到用户Y的信息。
从根本上说,您有两种选择来围绕您的应用程序传播信息:
- 将其保留在客户端,这样每个请求都会提供前面步骤中的信息。 (对于大量信息,这可能会变得笨拙,但对于简单的情况可能很有用。)
- 将其保存在服务器端,最好以某种持久方式(例如数据库)与客户端提供 session 标识符。
如果您可以使用负载平衡让所有用户都访问同一台服务器,并且如果您不介意在回收 AppDomain 时丢失 session < sup>1 或服务器宕机,您可以将其保存在内存中,以 session ID 为键...但要小心。
1 ASP.NET 中可能有一些机制可以解决这个问题,将 session 信息从一个 AppDomain 传播到另一个 - 我不确定
关于c# - 静态字段与 session 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14723486/