[英]Static fields vs Session variables
到目前为止,我一直在使用Session将一些变量从一页传递到另一页。 例如用户角色。 当用户登录Web应用程序时,该用户的角色ID将保留在Session中,并在应用程序的不同部分检查该角色。 我最近开始思考为什么不使用静态成员。 我可以将相同的信息存储在静态字段中,并在应用程序中的任何位置(包括该静态字段所在的名称空间的任何位置)轻松访问它。我知道使用Session变量有时很方便,例如:
除了以上所述,还有其他原因为什么我不应该使用静态字段来存储数据并使数据无处不在?
不,为此使用静态变量不是可行的方法:
从根本上讲,您有两种选择可以在应用程序中传播信息:
如果您可以使用负载平衡使所有用户都访问同一服务器,并且如果您不介意AppDomain回收1或服务器宕机时会话丢失,则可以将其保存在内存中,并以会话ID为键... 不过要小心。
1 ASP.NET中可能存在某种机制来解决此问题,将会话信息从一个AppDomain传播到另一个-我不确定
他们是两件事。
任何类型的数据都可以存储在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.