到目前为止,我一直在使用Session将一些变量从一个页面传递到另一个页面。例如用户角色。当用户登录到Web应用程序时,用户的角色ID保留在Session中,并且在应用程序的不同部分检查该角色。我最近开始考虑为什么不使用静态成员。我可以在静态字段中存储相同的信息,并在我的应用程序的任何地方轻松访问它(包括静态字段所在的命名空间的任何位置。)我知道使用Session变量有时会派上用场,这样:
除了上述内容之外,还有其他任何原因我不应该使用静态字段来存储数据并让它随处可用吗?
答案 0 :(得分:37)
不,使用静态变量是不的方法:
从根本上说,您有两种选择来传播应用程序周围的信息:
如果,您可以使用负载平衡来保持所有用户访问同一服务器,而 if 时,您不介意在AppDomain被回收时丢失会话< sup> 1 或服务器停机,你可以把它保存在内存中,用会话ID键入......但要小心。
1 ASP.NET中可能存在一些机制可以将其从一个AppDomain传播到另一个AppDomain - 我不确定
答案 1 :(得分:12)
它们是两个非常不同的东西。
任何类型的数据都可以存储在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"];
}
}
另见:
答案 2 :(得分:9)
你忘了一件事(我想)
静态数据对于应用程序的所有用户都是相同的,而会话是“每个用户”。
因此,对于您的“用户角色”方案,我希望有趣的结果;)
答案 3 :(得分:6)
静态字段将在所有用户之间共享 在Web环境中,您将有多个线程一起运行。
更新任何静态成员都需要适当的并发控制。如果错了,这会显着降低您的网站效果。
会话可以移出流程并在Web场中共享。
即使您的应用服务器崩溃,也会存在进程中的会话。