2011-06-24 106 views
6

我有一個WCF服務託管在Windows服務,我有2個程序集主機(.exe)和服務庫(.dll)。當服務庫更新時,我們必須停止服務才能更換庫。我希望具有IIS類似的功能,例如在不重新啓動服務的情況下替換庫。 這是可能的和如何?替換WCF服務庫,而不重新啓動服務

回答

4

IIS使用稱爲影子副本的東西來實現此目的。你可以爲你的服務主機實現類似的東西。基本上,這個想法是,在開始服務之前,將.DLL複製到其他位置,讓主機從該副本中加載服務類。主機然後設置文件系統監視器來偵聽對原始文件的更改。如果它檢測到一個,它會停止服務,複製新文件並重新啓動。

編輯

(1)要啓動一個特定的類型庫使用類ServiceHost的,你必須使用反射。類似以下內容:

Assembly myAssembly = Assembly.LoadFile(path); 

Type serviceType = myAssembly.GetType(className); 

ServiceHost serviceHost = new ServiceHost(serviceType); 

從文檔中不清楚LoadFile如何解決依賴關係。您可能需要掛接Assembly.ModuleResolve事件才能完成此工作。 (2)文件系統監視器肯定會產生一些開銷,但根據我的經驗,它是最小的。在任何情況下,除非您想使用安裝程序更新DLL,否則這是您唯一的選擇。

(3)我不知道爲什麼你的文件被鎖定。你必須自己解決這個問題。

+0

謝謝你的砧皮特。只是想明白你的意思主機重新啓動,你的意思是反正Windows服務必須重新啓動? – NDeveloper

+0

否。Windows服務應用程序從不重新啓動。 「重啓」意味着關閉託管服務的ServiceHost對象,複製新的DLL,然後創建並啓動一個新的ServiceHost對象。 –

+0

有沒有這樣的服務很多問題。我的意思是不會影響系統性能,因爲有很多filewatchers?還有如何告訴ServiceHost從精確的目錄加載程序集。 – NDeveloper

2

彼得有一個建議。根據大小以及是否可以擔保,另一種方法是將基礎架構移至至少2個羣集服務器。這允許您一次更新一個,而另一個繼續接受請求。只要您正確版本(合同更改==新方法),該方法就可以很好地工作,因爲舊客戶端會繼續獲取相同的數據,而不管您的新位是多少。

+0

是羣集服務器可以是一個實用的解決方案,但我感興趣的替代庫無需服務重啓是否有中斷。 – NDeveloper