[英]What is the scope of a static variable in ASP.NET / WCF / IIS?
這里有兩個問題都得到了很高的支持,但看似矛盾的答案。
靜態變量的實際范圍是什么?
就我而言,假設我有一個在IIS下運行的WCF服務。 多台服務器,前面有一個負載均衡器。 每台服務器上有一個站點,也有一個應用程序池。 假設在實現服務的類中存儲了一個靜態變量。
變量將僅在工作進程中持久存在嗎? 應用程序池? 服務器? 我試圖對其進行研究,但是在這里找到了兩個相互競爭的答案。
在此帖子下: IIS應用程序池,輔助進程,應用程序域
答復說:“每個工作進程都是運行您的站點的不同程序,它們都有單獨的[own?]靜態變量”。
然而在這篇文章下: ASP.NET靜態變量的生命周期
答復說“靜態變量是每個池”
也許我只是不理解這些帖子,但是它們似乎矛盾?
當我檢查時,似乎有幾個工作進程正在運行。 因此,我的問題。
任何幫助,將不勝感激。 我試圖重構一些東西,使其不使用靜態變量,因為這看起來很冒險並且暴露出並發問題,但是我在不了解當前行為的情況下提出更改感到非常不自在。 謝謝!
靜態變量在應用程序域的生命周期中一直存在。 因此,有兩件事會重置您的靜態變量:重新啟動應用程序域或使用新類
每個應用程序池可以有多個工作進程,
每個工作進程將運行不同的應用程序實例。
一個應用程序的每個實例都有一個單獨的AppDomain- 每個應用程序實例一個。
如果發生以下任何情況,當IIS重新啟動asp.net應用程序時,靜態變量將丟失
靜態變量不是線程安全的,如果從不同的線程訪問它們,則需要使用lock關鍵字。
由於應用程序重啟將重置您的靜態變量,並且您希望在應用程序生命周期內保留數據,因此應將數據永久存儲在數據庫或文件中。 您可以使用數據庫會話狀態模式將每個用戶的信息存儲在會話狀態中。
ASP.NET應用程序狀態/變量將無濟於事,因為它們存儲在內存中,因此它們不是持久性的,因此在應用程序域重啟時也會丟失。
當我們在Web中定義靜態字段時,它將僅與應用程序域限制共享。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.