簡體   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