2010-09-21 16 views
3

當重新啓動IIS一個ASP.Net(2.0)的web應用程序,它可以:防止IIS重用工作進程單獨ASP.Net的AppDomains

  • 回收在AppDomain:卸載應用程序域和加載在相同處理新的AppDomain(例如,當HttpRuntime.UnloadAppDomain()被調用時,當web.config中被改變)。
  • 回收過程:卸載應用程序域和負載上的處理一個新的(例如,經由INETMGR,或當達到內存限制上的程序池調用回收站命令時)。

由於一些內部原因(我們依賴的遺留本機代碼的問題),我們不能允許第一個選項。我們無法在同一個進程中加載​​兩次應用程序。

IIS可以以某種方式告訴絕不允許工作進程重用?

我試着通過跟蹤一個應用程序是否已經啓動了一個使用互斥鎖的進程來阻止它,如果是的話 - 在Application_Start()期間拋出一個異常);我也嘗試在Application_End()期間通過調用Environment.Exit()來終止此過程。這兩種方法的問題是,它會導致在Application_End或Application_Start期間到達的任何請求失敗(不像手動進程回收,因爲它們被立即重定向到新進程而絕對沒有請求失敗)。

回答

0

無法找到一種方法告訴IIS工作進程不會被重用。無法承擔解決禁止流程重用的基本問題。因此,最終在Application_End中調用Environment.Exit(0),儘管它可能會導致少量請求失敗且連接重置。

0

我相信「回收的AppDomain」談到下ASP.NET運行時的預覽和IIS沒有真正參與任何地方(我在IIS7的綜合管線的情況下,我不是100%肯定這個)。所以我不認爲你想要的是可行的。但也有幾個解決方法,你可以考慮你的問題:

  1. 確保您運行啓動代碼(操縱遺留代碼),只運行一次 - 這應該通過一個名爲系統semaphores是可能的。一旦系統信號量由工作進程中的應用程序啓動創建,它將一直存在直到進程被回收,因此您可以進行每個進程的初始化。

  2. 如果第1條是不可能的,那麼考慮託管代碼操縱遺留代碼在一個單獨的進程都在一起 - 這個過程可以通過命名管道通過WCF服務公開的相關功能。 ASP.NET將使用它們來使用遺留代碼。

+0

首先,感謝您的回覆。不幸的是,由於項目的後期階段,不可能完成# #2。 我試過#1與系統互斥體,但PROBL – 2010-09-22 09:23:42

+0

*,但我也沒多想跳過初始化(我只認爲是「堵」在同一個過程的附加初創公司,但是這引起了一些第一次請求失敗) 。我會盡力。 – 2010-09-22 09:32:09

+0

不幸的是,#1也變得不可能(不能跳過初始化,因爲一旦應用程序重新啓動,其中一些實際上是必需的)。 – 2010-09-26 14:00:25