2012-06-11 135 views
2

我正在寫一個web服務,並有以下觀察: 即使我只是將文本文件添加到存儲web服務所引用的所有dll的目錄(bin)中,appdomain也會刷新。AppDomain刷新/重新啓動

這會導致存儲在字典(在其中一個dll中)中的所有用戶會話都被刪除。

例如,如果上面的字典包含在一個dll中,比如說,sessiondict.dll,我正在替換另一個與sessiondict.dll沒有任何依賴關係的dll,那麼爲什麼這些數據會丟失?

我錯過了什麼?

編輯:

雖然我在的AppDomain重新閱讀更多,然而,尚未能弄清楚,爲什麼設計是這樣的,即使添加一個文本文件中的bin文件夾會導致appdomain重新啓動。

+0

在應用程序啓動時使用靜態'AppDomain.CreateDomain()'方法在單獨的AppDomain中加載會話dll:http://msdn.microsoft.com/en-us/library/47e8e141.aspx和此博客post:http://www.west-wind.com/weblog/posts/2009/Jan/19/Assembly-Loading-across-AppDomains – VS1

+0

我特別想知道爲什麼會出現這種行爲。微軟不應該注意只編譯那些已經改變的依賴關係。爲什麼上傳bin文件夾中的文本文件應該會導致appdomain刷新/重新啓動? – Cik

+0

這篇文章應該可以幫助你理解它的一些內容:http://www.techrepublic。com/blog/programming-and-development/add-stability-to-your-aspnet-applications-with-appdomains/429 – VS1

回答

2

這是標準行爲 - 任何時候觸及bin目錄中的任何內容(以及其他位置,如web.config),那麼您的appdomain將回收。

您不應該將數據存儲在bin目錄中。您還應該意識到,默認情況下IIS會定期回收appdomain,除非您已經告訴它不要(默認情況下每天一次,我相信)。

因爲無論如何您都無法替換應用程序的某個部分,所以我不確定這樣做的正確理由是什麼?

This post是什麼可以導致AppDomain回收的一個很好的解釋。

+0

如果您需要修改默認的回收行爲出於某種原因,這篇博文應該很有用:http://weblogs.asp.net/owscott/archive/2006/02/21/ASP.NET-v2.0-_2D00_ -AppDomain-recycles_2C00_,更常見的超before.aspx。編輯:對不起,該評論中的鏈接被破壞 - 您可能需要手動檢查該人的博客。 –

+0

接受@ Richard的回答。他很好地指出硬幣的另一面是什麼。定義Web服務的程序集是bin目錄。可能很簡單,但我花了很多時間來理解這一點,因爲我想知道可能會有什麼影響。例如,工作進程將跟蹤bin目錄中發生的所有更改。這將有必要解決對調用堆棧幀中地址的未定義引用的風險。可能這也是組件無法從進程動態卸載的原因。 – Cik

0

Dictionary存儲在應用程序域內的內存中的局部變量中。 當在bin文件夾中更新內容時AppDomain被回收。回收意味着.NET卸載現有的AppDomain(清除存儲在所有加載類中的所有本地可變元素使用的內存)並構造新的AppDomain並啓動新類(這可能會在代碼中創建一個空的Dictionary)。

如果DLL發生變化,它並不重要。 Class的實例被銷燬,因爲ASP.NET認爲bin文件夾中的任何更改都會影響配置,並且應該使用新配置重新啓動站點。

爲了解決這個問題,您可以:在持久性存儲(prefferable)

  • 不要更新BIN文件夾的內容

    1. 存儲關鍵Session變量。