2009-01-17 107 views
7

在ASP.NET 3.5(帶有IIS6)中,是否爲每個請求創建了AppDomain?我知道所有的應用程序在w3wp.exe下都有自己的AppDomain,但是整個AppDomain的工作原理是什麼?是否爲每個請求創建AppDomain?

今天我和一位同事試圖說服我,如果一個ASP.NET應用程序有一個靜態對象(或Singleton類),那麼這個對象將在所有請求之間共享。我認爲這是錯誤的。我對嗎?我如何說服我的同事?

謝謝!

回答

9

我很抱歉地說你的同事是對的。在ASP.NET應用程序中,在IIS中配置的每個應用程序都在其自己的AppDomain內運行,這是單例對象的範圍。因此,App1中的一個單例可用於App1的所有請求(如果處理不當,可能會變爲併發),但App2中的請求無法訪問App1中的單例。

Threading and Pooling in the HTTP Pipeline http://i.msdn.microsoft.com/cc164128.fig01(en-us).gif

這從MSDN雜誌圖有助於顯示每個應用程序是如何在自己的AppDomain隔離。雖然該圖顯示了IIS5工作進程(aspnet_wp.exe),但對於配置爲在同一個應用程序池中運行的應用程序,IIS6工作進程也會類似。

1

單身人士將存在於appdomain的整個範圍內。此外,對您的應用程序的所有請求都會轉到同一個應用程序域,所以您的同事實際上是正確的。

更新:由好奇心刺激的問題,我發現一個「單身」,你可以使用per-request basis。但我並不真的建議。如果有人需要每個請求單身人士,那麼他們需要找到更合適的模式。

+0

你有什麼想法的文件,我可以參考?謝謝! – Martin 2009-01-17 05:49:33

相關問題