2010-10-18 58 views
7

能夠部署必須更新的Windows服務的一些最佳實踐是什麼?針對Windows服務的C#ClickOnce部署?

我有一個Windows服務,我將部署,但在測試過程中可能需要一些調試和新版本。處理這個問題的最好方法是什麼?理想情況下,我希望爲Windows服務找到ClickOnce風格的部署解決方案,但我的理解是,這不存在。對於Windows服務,我可以最接近ClickOnce的是什麼?

+0

另見http://stackoverflow.com/questions/4002462/how-can-i-write-a-java-application-that-c​​an-update-itself-at-runtime/4002465#4002465 – 2010-10-28 06:15:54

回答

7

我使用的一個簡單的解決方案是僅停止服務並將文件從我的bin文件夾複製到服務文件夾中。

批處理文件停止服務然後複製文件應該很容易扔在一起。

Net stop myService 
xcopy \\myServerWithFiles\*.* c:\WhereverTheServiceFilesAre 
net start myService 
+1

我喜歡這個,快速簡單! – Lukasz 2010-10-25 19:27:59

+0

嘿,我喜歡這個。我基本上在調試時手工做同樣的事情。 – nportelli 2010-10-29 12:06:21

2

由於服務是無論如何長時間運行,使用ClickOnce部署的風格可能是不可行的 - 因爲只有ClickOnce的更新,當你啓動應用程序。服務通常只會在機器重新啓動時啓動。

如果您需要服務的自動更新,那麼您最好的選擇可能是將某些東西手動編碼到服務中,但是我幾乎可以解決所有解決方案的問題:大多數安裝過程需要一定程度的用戶交互(如果只是爲了繞過UAC),所以我無法想象這會導致一個答案,不涉及在某個時刻在屏幕前獲取登錄用戶。

可能正常工作的一個想法是活動目錄部署(或一些類似的等價物)。如果您的服務是通過標準MSI類型的安裝程序部署的,則AD允許您以靜默方式更新應用程序,作爲計算機策略的一部分。我懷疑你不得不強制服務器刷新AD策略(通過從控制檯重新啓動或使用gpupdate),但除此之外,它應該是一個不干涉的部署。

3

我會建議使用這個的「插件」的方法,即,使用Proxy Design Pattern

雖然使用這種模式,一個獨立的線程可以驗證經更新的文件夾。您需要在組件部署中使用ShadowCopy。當您的服務更新線程遇到您的服務的新版本時,它應該卸載當前生產裝配並加載新版本,而不停止服務本身。更!如果程序集中沒有破壞代碼,您的服務不應該注意到這種差異。

+0

+1。類似於這個問題的答案:http://stackoverflow.com/questions/4002462/how-can-i-write-a-java-application-that-c​​an-up-date-itself-at-runtime/4002465#4002465 – 2010-10-28 06:15:25

3

我有一個系統,我們在這裏工作,似乎很好地與服務功能。我們部署的系統在任何時候都有大約20-30個服務。在工作中,我們使用一個名爲TopShelf你可以在這裏找到它http://topshelf-project.com/

基本上TopShelf處理大量的業務相關的東西的產品。從服務的cmd行安裝,卸載等。其中一個非常有用的功能是作爲調試控制檯運行的能力。您創建一個服務,並使用不同的cmd行開始,您可以將其作爲控制檯運行以查看服務的輸出。我們在該軟件中添加了一項自定義功能,可讓我們提前配置配置文件。基本上我們的配置文件配置了一些東西,如日誌記錄,資源位置等,以便我們可以控制所有這些,而無需重新發布任何代碼。我們所要做的就是運行一個命令像

d:\ SERVICES \ ServiceName.exe Core.Profiles.Debug
d:\ SERVICES \ ServiceName.exe Core.Profiles。生產

獲得不同的日誌配置。

我們的構建腳本爲我們的每項服務創建install.cmd和uninstall.cmd腳本,我們所做的只是將文件複製到服務器並運行腳本。如果我們想看到調試輸出,我們停止服務並雙擊exe文件,我們得到一個控制檯來讀取所有輸出。

還有一件事我們沒有使用,因爲它沒有必要是頂棚的概念(這裏有關於這個網站的文檔)。這使您可以更新服務而無需「重新啓動」,但您仍然需要手動複製文件,除非您爲此創建自動化系統。

但是,我的建議,如果你需要100%的服務可用性是有一個冗餘的系統。無論您如何配置服務以進行更新,都無法避免硬件故障導致停機而無需自動故障轉移系統。如果所述系統就位,我建議的更新策略是關閉1個節點,更新,測試,打開關閉另一個節點,更新,測試並重新打開第二個節點。當然你可以用一個簡單的腳本來做到這一點。這可能是一個比你需要的系統更復雜的系統,但是如果你不能在5秒鐘內完成一個簡單的重啓服務,那麼你確實需要一些系統來處理硬件問題,因爲我可以保證它最終會發生。