在不重新启动服务的情况下替换WCF服务库

本文关键字:服务 替换 WCF 情况下 重新启动 | 更新日期: 2023-09-27 18:00:10

我有一个WCF服务托管在windows服务中,我有两个程序集-主机(.exe)和服务库(.dll)。当服务库更新时,我们必须停止服务,以便可以替换库。我想拥有类似IIS的功能,比如在不重新启动服务的情况下替换库。这可能吗?怎么可能?

在不重新启动服务的情况下替换WCF服务库

IIS使用一种称为卷影副本的东西来实现这一点。您可以为您的服务主机实现类似的功能。基本上,我们的想法是在启动服务之前,先复制。DLL到其他位置,并让主机从该副本加载您的服务类。然后,主机设置一个文件系统监视器来侦听对原始文件的更改。如果检测到一个,它将停止服务,复制新文件,然后重新启动。

编辑

(1) 要使用特定类型库中的类启动ServiceHost,必须使用反射。类似以下内容:

Assembly myAssembly = Assembly.LoadFile(path);
Type serviceType = myAssembly.GetType(className);
ServiceHost serviceHost = new ServiceHost(serviceType);

从文档中还不清楚LoadFile是如何解析依赖关系的。你可能不得不勾住大会。ModuleResolve事件以使其工作。

(2) 文件系统监视器肯定会产生一些开销,但根据我的经验,这是最小的。在任何情况下,这实际上是您唯一的选择,除非您想使用更新DLL的安装程序。

(3) 我不知道为什么你的文件被锁定了。你必须自己解决这个问题。

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