我有一个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