2010-02-05 82 views
1

我只能讀取ASP.NET檢測到特定文件(如aspx文件,DLL等)的更改。它將自行重新啓動,使用新部署的文件完成當前運行的請求和新的請求。ASP.NET如何處理部署

但是從第一個文件複製到最後一個被更換的時間發生了什麼?如果我交換第一個DLL文件,然後請求進來,但其他DLL文件是在一個較舊的版本 - 它只會崩潰?請問asp.net會等待幾秒鐘,並且在沒有(相關)文件更改X秒後纔會自動啓動新的操作?

Thx!

回答

2

這裏有4個問題: 從第一個文件複製到最後一個被更換的時間發生了什麼? - 有一段時間,.net等待查看是否有任何其他文件已被修改,然後啓動新的應用程序域並加載新的dll。

如果我交換第一個DLL文件,然後請求進來,但其他DLL文件是在舊版本 - 它只會崩潰? - 這取決於dll中的代碼更改。如果新的DLL可以很好地運行舊代碼,那麼它會沒事的。但是,如果應用程序域旋轉了新的DLL,並且新的DLL依賴於那些還沒有的東西,那麼是的,它會拋出一個異常。

asp.net是否會等待幾秒鐘,只有在沒有(相關)文件更改X秒後纔會自動啓動新的? - 是的。我一直無法找到那段時間。但在我個人的經驗中,它在1-2秒的範圍內。

我還發現了一個很好的解釋這裏的DLL的應用程序域和重新加載: http://odetocode.com/Articles/305.aspx

如果複製更新的DLL到 應用程序的bin子目錄中, ASP.NET運行時承認有是 要執行的新代碼。由於ASP.NET 不能將該dll交換到現有的 AppDomain中,因此它將啓動一個新的AppDomain。 舊的應用程序域名爲「drain stopped」,即現有請求 被允許執行完畢,而 一旦全部完成 AppDomain可以卸載。新的 AppDomain以新代碼開始,並且 開始接受所有新請求。

通常,當一個dll加載到一個 進程中時,該進程會鎖定dll和 ,您無法覆蓋磁盤上的文件。 但是,AppDomain具有稱爲Shadow Copy的 功能,允許 程序集保持解鎖狀態, 可在磁盤上替換。

運行時初始化ASP.NET 已啓用對bin 目錄的卷影複製。在鎖定 並將dll加載到內存之前,AppDomain會將其需要的任何 dll從bin目錄複製到 臨時位置。 Shadow Copy允許我們在 更新期間覆蓋bin目錄中的任何 dll,而無需使web 應用程序脫機。

+0

太好了 - 這正好回答我的問題! 謝謝你的詳細解答:) – Eleasar 2010-04-07 10:18:57