2012-03-11 78 views
11

我們使用IIS7來託管基於Web的應用程序。 在此環境中,管理員和開發人員可以定期將代碼部署到應用程序。IIS應用程序池/重新啓動和ASP.NET

新代碼或應用程序將作爲DLL傳遞到ASP.NET bin文件夾。在部署新的DLL後,IIS重新啓動該過程,影響(減慢)所有在線用戶。

有沒有辦法配置IIS在後臺運行進程,並且一旦準備好從舊狀態切換到新狀態而不影響用戶?

在此先感謝您的反饋!

回答

26

IIS已經這樣做,這就是回收的全部內容。 IT的加載DLL的應用程序的舊版本仍在運行。只有在這完成後,回收才完成。

然而加載DLL的是讓Web應用程序準備中的一部分,也可能有類似的裝載/初始加載緩存的用戶數據庫等
這些行動是不是循環過程的一部分,他們發生畢竟DLL重新加載並且回收已經完成。

一段時間後,我遇到了一個應用程序,由於在啓動過程中數據庫活動/緩存過大而導致啓動時間很長。所以我很感興趣的是,如果有一些功能允許我們在回收標記爲完成之前執行代碼,那麼應用程序首先會在所有內容都可以運行時被回收。基本上我想要的是某種分段功能。
我曾就此問題與IIS團隊聯繫,不幸的是他們告訴我沒有這樣的功能存在,也沒有計劃

爲了解決這個問題,你可以嘗試做到以下幾點:

  • 交替使用部署:
    你設置2個網站有獨立的應用程序池。其中一個是LIVE網站,另一個是STAGED網站。如果您想部署更改,只需部署到STAGED網站即可。在加載/緩存所有內容之後,您可以切換Web應用程序的URL設置,以將傳入請求從LIVE重新路由到STAGED。所以現場演出成爲新的STAGED,而其他方式。接下來的部署將再次轉到新的STAGED等等。

UPDATE
顯然,他們已經創建了一個IIS模塊,它現在提供了此功能:

IIS應用程序熱身模塊爲IIS 7.5

的IIS團隊已經發布了針對IIS 7.5的 應用程序預熱模塊的第一個beta測試版本。這使得您的應用程序變得比以前描述的更容易。自定義代碼,而不是編寫 自定義代碼,而是指定要在網絡應用程序接受來自網絡的請求之前執行的資源的URL。在啓動IIS服務期間(如果將IIS 應用程序池配置爲始終運行)以及回收IIS工作進程 期間發生此熱身活動 。在回收期間,舊的IIS工作進程繼續執行請求,直到新產生的工作進程完全預熱,直到完全 ,以便應用程序不會因未發生引用的高速緩存而中斷或其他 問題。請注意,該模塊可與任何版本的ASP.NET的 版本一起使用,從版本2.0開始。

有關詳細信息,請參閱IIS.net Web站點上的應用程序預熱。 有關演示如何使用熱身功能的演練,請參閱 IIS.net Web站點上的IIS 7.5應用程序熱身模塊入門。

參見:

http://www.asp.net/whitepapers/aspnet4

如果您使用ASP.NET 4自動啓動功能:

您仍然可以選擇自動從回收的工作進程時間到 時間。然而,當你這樣做時,應用程序會立即重新啓動,並執行你的預熱代碼(不像今天 - 你必須等待 下一個要做的事情)。

預熱和自動啓動功能的主要區別在於預熱模塊是回收過程的一部分。而不是在運行初始化代碼時阻塞請求的應用程序。
只有使用自動啓動功能才能得到的結果是,您不必等待用戶點擊該頁面,這對您的情況無效。

見顧的博客文章:

http://weblogs.asp.net/scottgu/archive/2009/09/15/auto-start-asp-net-applications-vs-2010-and-net-4-0-series.aspx

更新2:

可悲的是熱身模塊已經停產IIS 7/7.5:

http://forums.iis.net/t/1176740.aspx

這將是雖然(它現在被稱爲應用程序初始化模塊)IIS8的一部分:

http://weblogs.asp.net/owscott/archive/2012/03/01/what-s-new-in-iis-8.aspx

更新3:

正如在評論中指出熱身模塊重新出現在IIS 7.5中,作爲IIS 7的應用程序初始化模塊。5 IIS 8後被釋放:

http://www.iis.net/downloads/microsoft/application-initialization

+0

非常感謝您的意見,我瞭解,我需要移動我的緩存和預加載行動到一個進程外模式,我可以卸載一些應用程序的init工作,並實現「自動啓動」 ð終於等到了IIS8 :) – sam360 2012-03-12 12:32:08

+1

熱身模塊仍然存在於IIS 7.5的_Application初始化模塊爲IIS 7.5_: http://www.iis.net/downloads/microsoft/application-initialization – NicolasF 2012-11-07 13:47:08

5

ntziolis answer第一部分是凌晨一點不準確的。工作進程沒有被回收或重新啓動,它只是繼續運行。如果是這種情況,那麼在共享池環境中,每次部署新的網站時都會導致網站被淘汰。

當您部署新的ASP.NET應用程序時,它是該網站的「應用程序域」之內,工作進程被拆除,而不是池進程。

另外池回收是一個完全獨立的概念,部署

在這個時間點在ASP.NET的商業生活中,在部署期間,網站將處於不一致的狀態,直到所有的網站被部署。目前微軟還沒有關於單個服務器部署單個站點的好消息。

這就是爲什麼ASP.NET有特殊的App_Offline.htm頁面。它在那裏,所以你可以啓用該頁面,部署然後關閉它。

ntziolis answer的第二部分基本正確,但不需要兩個站點或兩個應用程序池。您只需要兩個文件系統文件夾即可作爲站點的物理文件夾進行切換......如果您位於單個服務器上,而不在負載平衡器或ARR後面。

如果您的站點位於負載均衡器或ARR後面的Web服務器上,那麼擁有兩個不同的站點是有意義的,您可以將請求從一個站點路由到另一個站點,並在每個部署中循環。

顯然,如果有大量的用戶生成的內容(上傳的文件等),那麼你應該將你網站上的虛擬目錄映射到這個數據的公共位置。

在您的應用運行跨越大規模部署(例如)負載平衡的環境中,您可以執行更復雜的部署。

對於相關的問題,請參見:

How Do I deploy an application to IIS while that web application is running

Publishing/uploading new DLL to IIS: website goes down whilst uploading

Is smooth deployment possible with componentized ASP.NET MVC apps?

+0

本來可以更精確在第一部分中,有一點是在再次閱讀之後交叉部署+回收;)。不過,我認爲他的問題是昂貴的應用程序啓動代碼,而不是實際的部署相關的,因此我專注於缺乏IIS 8之前的預熱模塊 – ntziolis 2012-03-12 02:28:42