gpt4 book ai didi

c# - ASP.NET/WCF/IIS 中静态变量的作用域是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 14:40:05 24 4
gpt4 key购买 nike

这里有两个问题都获得了高度赞成,但答案似乎相互矛盾。

静态变量的实际作用域是什么?

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

变量是否只在工作进程中持续存在?应用程序池?服务器?我试图对其进行研究,但在这里发现了两个相互矛盾的答案。

在这个帖子下: IIS app pools, worker processes, app domains

回复说“每个工作进程都是一个运行您网站的不同程序,有自己的[自己的?] 静态变量”

然而在这个帖子下: Lifetime of ASP.NET Static Variable

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

也许我只是看不懂帖子,但它们看起来很矛盾?

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

如有任何帮助,我们将不胜感激。我正在尝试重构一些东西而不是使用静态变量,因为它看起来有风险并且会暴露并发问题,但我非常不舒服在不了解当前行为的情况下提出更改。谢谢!

最佳答案

静态变量在应用程序域的生命周期内持续存在。因此,有两件事会重置您的静态变量,即应用程序域重启或使用新类

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

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

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

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

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

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

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

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

关于c# - ASP.NET/WCF/IIS 中静态变量的作用域是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57450916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com