我有一個WCF服務託管在Windows服務,我有2個程序集主機(.exe)和服務庫(.dll)。當服務庫更新時,我們必須停止服務才能更換庫。我希望具有IIS類似的功能,例如在不重新啓動服務的情況下替換庫。 這是可能的和如何?替換WCF服務庫,而不重新啓動服務
6
A
回答
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)我不知道爲什麼你的文件被鎖定。你必須自己解決這個問題。
2
彼得有一個建議。根據大小以及是否可以擔保,另一種方法是將基礎架構移至至少2個羣集服務器。這允許您一次更新一個,而另一個繼續接受請求。只要您正確版本(合同更改==新方法),該方法就可以很好地工作,因爲舊客戶端會繼續獲取相同的數據,而不管您的新位是多少。
+0
是羣集服務器可以是一個實用的解決方案,但我感興趣的替代庫無需服務重啓是否有中斷。 – NDeveloper
相關問題
- 1. 重新啓動服務器後重新啓動WCF服務
- 2. 從服務重新啓動Windows服務
- 3. WCF服務不能啓動
- 4. wcf服務啓動
- 5. 重新啓動Unix服務
- 6. Android:Activity.onDestroy()重新啓動服務
- 7. Android重新啓動服務
- 8. Windows服務 - 重新啓動?
- 9. Windows服務重新啓動
- 10. 重新啓動服務
- 11. 重新部署彈簧引導服務而不重新啓動?
- 12. 重新生成Django ChoiceField而不重新啓動服務器
- 13. 重新加載Freeradius客戶端而不重新啓動服務
- 14. 上重新啓動服務器proftp的服務不會自動
- 15. WCF服務而不是ASMX Web服務?
- 16. 重新啓動服務器後無法啓動SQL服務
- 17. Android:無法從重新啓動服務替換捆綁
- 18. 服務不在重新啓動
- 19. Android:粘滯服務不重新啓動
- 20. WCF服務無法啓動
- 21. wcf服務無法啓動
- 22. 如何重新啓動服務器後重新啓動RoR服務
- 23. 更新Windows服務程序集而不重新啓動它?
- 24. 在Node.js中更新文件而不重新啓動服務器
- 25. 重新啓動PHP的CentOS服務器? (不是PHP服務,但服務器)
- 26. WCF服務庫
- 27. WCF雙工服務,當服務重新啓動時客戶端丟失
- 28. .NET Windows服務 - 通過服務重新啓動獲取更新
- 29. 動態更改到服務器,而無需重新啓動服務器
- 30. Ria服務替代WCF服務
謝謝你的砧皮特。只是想明白你的意思主機重新啓動,你的意思是反正Windows服務必須重新啓動? – NDeveloper
否。Windows服務應用程序從不重新啓動。 「重啓」意味着關閉託管服務的ServiceHost對象,複製新的DLL,然後創建並啓動一個新的ServiceHost對象。 –
有沒有這樣的服務很多問題。我的意思是不會影響系統性能,因爲有很多filewatchers?還有如何告訴ServiceHost從精確的目錄加載程序集。 – NDeveloper