繁体   English   中英

ASP.NET/WCF/IIS中的静态变量的范围是什么?

[英]What is the scope of a static variable in ASP.NET / WCF / IIS?

这里有两个问题都得到了很高的支持,但看似矛盾的答案。

静态变量的实际范围是什么?

就我而言,假设我有一个在IIS下运行的WCF服务。 多台服务器,前面有一个负载均衡器。 每台服务器上有一个站点,也有一个应用程序池。 假设在实现服务的类中存储了一个静态变量。

变量将仅在工作进程中持久存在吗? 应用程序池? 服务器? 我试图对其进行研究,但是在这里找到了两个相互竞争的答案。

在此帖子下: IIS应用程序池,辅助进程,应用程序域

答复说:​​“每个工作进程都是运行您的站点的不同程序,它们都有单独的[own?]静态变量”。

然而在这篇文章下: ASP.NET静态变量的生命周期

答复说“静态变量是每个池”

也许我只是不理解这些帖子,但是它们似乎矛盾?

当我检查时,似乎有几个工作进程正在运行。 因此,我的问题。

任何帮助,将不胜感激。 我试图重构一些东西,使其不使用静态变量,因为这看起来很冒险并且暴露出并发问题,但是我在不了解当前行为的情况下提出更改感到非常不自在。 谢谢!

静态变量在应用程序域的生命周期中一直存在。 因此,有两件事会重置您的静态变量:重新启动应用程序域或使用新类

每个应用程序池可以有多个工作进程,

每个工作进程将运行不同的应用程序实例。

一个应用程序的每个实例都有一个单独的AppDomain- 每个应用程序实例一个。

如果发生以下任何情况,当IIS重新启动asp.net应用程序时,静态变量将丢失

  1. 池决定需要重新编译。
  2. 您打开app_offline.htm文件
  3. 手动重启应用程序池
  4. 池已达到服务器上定义的某些限制,然后重新启动。
  5. 重新启动iis

静态变量不是线程安全的,如果从不同的线程访问它们,则需要使用lock关键字。

由于应用程序重启将重置您的静态变量,并且您希望在应用程序生命周期内保留数据,因此应将数据永久存储在数据库或文件中。 您可以使用数据库会话状态模式将每个用户的信息存储在会话状态中。

ASP.NET应用程序状态/变量将无济于事,因为它们存储在内存中,因此它们不是持久性的,因此在应用程序域重启时也会丢失。

当我们在Web中定义静态字段时,它将仅与应用程序域限制共享。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM