替换WCF服务库而不重新启动服务

时间:2011-06-24 14:02:02

标签: c# .net wcf iis windows-services

我在Windows服务中托管了一个WCF服务,我有2个程序集,主机(.exe)和服务库(.dll)。更新服务库后,我们必须停止服务才能更换库。我想有IIS类似的功能,比如更换库而不重新启动服务。 它有可能吗?如何?

2 个答案:

答案 0 :(得分: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)我不知道为什么你的文件被锁定了。你必须自己排除故障。

答案 1 :(得分:2)

彼得有一个建议。根据大小以及是否可以保证,另一种方法是将基础架构移至至少2个群集服务器。这允许您一次更新一个,而其他人继续接受请求。只要您正确版本(合同更改==新方法),此方法就能很好地工作,因为无论您的新位如何,旧客户端都会继续获得相同的数据。