2009-07-07 101 views
14

我即將開發一個程序,該程序將作爲Windows服務在多個客戶端的後端服務器(具有互聯網訪問)上安裝和運行。我沒有物理訪問服務器。我正在努力的是可靠地推出更新程序的方案。自動更新Windows服務

我花了相當多的時間尋找Windows Service自動更新的最佳實踐,但發現了很少有用的信息。大多數技術(如ClickOnce)似乎主要針對基於Windows Forms的應用程序。

我目前的計劃是:

  • 有更新可用時,有正在運行的服務下載,安裝並啓動更新服務。
  • 更新服務將下載新版本的主要服務,並將其並行安裝在當前仍然有效的版本中。
  • 更新服務接下來停止舊版本,然後啓動新版本的服務。
  • 新版本在啓動過程中禁用更新服務。

我一些重要的擔憂是:

  • 能夠處理既可以更新到主業務和更新服務
  • 能夠處理中斷,如電源故障或連接失敗更新過程中的任何一點

有什麼想知道的是,如果這是解決這個問題的常用方法和/或如果我錯過了任何關鍵的東西。它太複雜了,還是太簡單了?你會怎麼做(或者更好,你是如何成功完成的)?

謝謝!

回答

13

去年我面臨同樣的問題,我也遇到了很多相同的問題。建議的幾個位:

  • 由於任一服務可能會更新, 這兩種服務將作爲其他的 更新程序。服務A將 更新服務B,反之亦然。對於 這個原因,我建議在任何時候都簡單地運行 兩種服務。除非 您真的很擔心 下降您的服務器與 確實更新存在調用, 啓用/禁用服務管理 是不值得的開銷。

  • 就像服務不能安裝在一臺 單機上。換句話說,你 不能安裝 並行服務的新舊版本,如果他們有 相同的名稱。除非您想讓 更新過程變得複雜,否則我建議您卸載舊版本 ,然後安裝新版本。 例如,服務A將下載 服務B安裝程序,卸載 服務B,安裝新版本 服務B,然後運行。服務B 會做同樣的服務A.

  • 由於每個服務管理 另一方面,他們不僅要檢查 可用更新,但他們應該 覈實對方的健康。例如,對於 示例,如果服務B存在並且它運行的是 ,則服務A將檢查看 。如果健康檢查失敗, 一所列步驟來解決問題 並獲得服務運行將 完成了服務A.執行的 健康檢查和恢復操作 將覆蓋你現在無論什麼問題 出現與更新,初始的 安裝或一般操作。

  • 在客戶端 和服務器上都做了充足的日誌記錄。您需要跟蹤 採取了何種行動和何時採取了行動。 例如,服務A可能會在 正在檢查更新,當它執行健康檢查的 和 關聯的操作。在服務 (假設您打電話到網絡 服務尋找更新)跟蹤 每個服務的調用。如果 你的服務沒有得到更新 至少你會有 痕跡痕跡(或缺少麪包屑) 指出你的問題。

從字面上有蕉潛在的陷阱與這種解決方案:在啓動時不運行的服務,UAC的方式獲得,不能夠使用相同的用戶安裝和卸載服務,確保用戶在安裝該服務具有足夠的權限,連接丟失,在客戶端計算機上安裝.NET Framework,在必要時安裝後處理重新啓動等。

祝您好運。這是一個有趣的問題需要解決,但如果沒有挫折感,這種問題就不會發生 - 尤其是因爲,正如你所說的那樣,沒有很多可用的文件資料。

+0

感謝您的寶貴意見。您是如何處理在舊版本被卸載之後但在新版本安裝之前更新過程中斷的潛在情況?你有沒有跟蹤你在這個過程中有多遠? – 2009-07-07 21:24:00