2011-06-24 80 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