2013-02-06 49 views
24

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

  1. 任何类型的数据都可以存储在Session中。然后它必须被铸造。但静态字段只接受具有正确数据类型的数据。
  2. 会话变量将在一段时间后过期,这是我们在许多情况下需要的行为。

除了上述情况,还有其他什么原因让我不应该使用静态字段来存储数据并在任何地方都可用?

+0

嗨,你可以参考到http://计算器.com/questions/1563171/asp-net -c-sharp-static-variables-are-global –

+2

千万不要使用静态字段来处理与用户相关的数据。 他们应该只用于你必须维护应用程序范围内的东西 –

回答

31

没有使用静态变量,因为这是要走的路:

  • 如果您的AppDomain被回收,所有静态变量将是“复位”
  • 静态变量不扩展水平方向 - 如果你负载平衡你的应用程序,那么命中一台服务器然后不同的用户将不会在第一台服务器的静态变量中看到数据存储区
  • 最重要的是,静态变量将共享全部访问该服务rver ...根本不会基于每个用户...而从描述中,您不希望用户X看到用户Y的信息。

从根本上说,你有在你的应用程序传播信息两种选择:

  • 保持它的客户端,所以每个请求给在前面的步骤的信息。 (这对于大量的信息可能会变得笨重,但对于简单的情况可能会很有用。)
  • 保留它在服务器端,理想情况下在某些永久方式(例如数据库)与客户端提供会话标识符。

如果您可以使用负载平衡,以保持所有用户都去同一个服务器,如果你不介意当AppDomain中被回收服务器下去会话丢失或,您可以将其保存在内存中,以会话ID键入......但要小心。


有可能是在ASP.NET机制的生存之本,传播会话信息从一个AppDomain中的另一个 - 我不知道

+1

我现在意识到我必须对我的代码做很多修改,因为我在各个地方都使用了静态字段。谢谢Jon的广泛解释。 –

9

他们是两个完全不同的东西。

  • 会话可以使用方法(用于负载均衡重要)
  • 会议可能是因为它出来的过程能力更持久。
  • ASP.Net自动管理会话并发性。
  • 访问静态变量需要手动同步。
  • 静态是整个应用程序域的全局。如果您为一个用户设置了静态字段/属性的值,则所有用户都将获得相同的值。不是您的方案中所需的行为。

任何类型的数据都可以存储在Session中。然而,它必须被铸造为 然而,静态字段仅接受具有正确数据类型的数据。

通过辅助类抽象会话值通常很有帮助。这可以提高可测试性,还可以强类型属性并在类的内部执行强制类型转换。

例子:

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

参见:

+3

你从一场灾难中拯救了我。 –

+0

哈哈,真棒!很高兴我能帮上忙。 –

7

你忘了一件事(我认为)

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

所以对于您的“用户角色”的情况,我希望有趣的结果;)

3

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

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

会话可以从流程中移出并通过Web场共享。

即使您的应用程序服务器崩溃,也不会出现proc会话。

+0

提及并发性。即使静态成员是正确的选择(有时它们有利于共享数据),访问必须正确同步。 –