Static会如何在asp.net中表现?

时间:2011-03-01 13:49:46

标签: c# asp.net static


我有一个带有c#语言的asp.net应用程序。我有一个公共类,它维护常量和静态变量和字段。我也有一个登录页面。如果用户登录成功,我将IsLoggedInSuccessfull设置为公共类中的静态布尔变量。

我的问题是:这只适用于特定的用户会话还是整个应用程序?

编辑: 根据一些答案,我在这里得到了另一个问题。

假设我使用静态方法Authenticate(User objUser)。意图是在用户点击登录按钮时调用此方法。在登录按钮的位置我要说准备User对象具有登录所需的某些参数,然后传递给此方法。那会有什么影响?假设我现在有单个服务器(没有服务器场或花园)。然后会有单一的应用程序级别方法来验证用户,对吧?并说10000用户将登录到这个站点/应用程序然后如何authenticate()方法的行为? CLR会自动管理那里的线程吗?

4 个答案:

答案 0 :(得分:1)

静态类将保持该值。

但是,使用Session会更好,因为它在Web应用程序中更直观,并且是一种广泛使用的实践。

这是一篇关于这个主题的好文章:

Managing Your Static Data in ASP.NET

答案 1 :(得分:1)

如果您要对静态类进行更改,那么它将用于整个应用程序的特定实例

如果您正在运行多个负载平衡的实例,则只会在其中一个实例中设置它。

答案 2 :(得分:1)

静态变量位于应用程序级别,因此它跨会话共享。

所以你的情况:

  

如果用户登录成功我设置   IsLoggedInSuccessfull作为静态   普通类中的布尔变量。

现在,对于每个用户登录Web应用程序,如果检查变量IsLoggedInSuccessfull,则该值为true。所以你可能想把这个变量保存为会话变量,而不是静态变量。

另请注意,如果您有一个Web场,则每个服务器都有一个运行Web应用程序的实例 - 这意味着在每个应用程序实例上,静态变量可能具有不同的值(如果您不小心) 。网络花园的原则相同......

关于你的第二个问题:
CLR不管理线程安全 - 您需要自己处理它。话虽这么说,如果静态方法本身不使用任何全局静态变量,并且如果传递给静态方法的User实例是唯一的,那么您应该是安全的。如果User实例唯一,请确保将线程安全代码放在User类的相应位置。

答案 3 :(得分:0)

静态变量将在应用程序实例之间共享,这意味着当您运行单实例应用程序时,它对于每个请求(用户)都是相同的变量。 有关用户特定信息,请使用session对象。