WCF 服务是否可以重新启动自身

本文关键字:重新启动 服务 是否 WCF | 更新日期: 2023-09-27 17:57:18

我目前正在开发一个WCF服务,该服务保存和处理应用程序的所有数据,而MySql数据库用于持久性。该服务目前作为单例(InstanceContextMode.Single)工作,并支持多个并发呼叫(ConcurrencyMode.Multiple)。我不太确定该服务托管在哪个版本的 IIS,但我相信它是 IIS 7.5。

问题在于,在某些情况下,如果发生异常(例如:在释放ReaderWriterLockSlim锁时),如果用户继续调用服务,服务将处于不可靠的状态,并且数据可能会损坏(并写入数据库)。

目前,我知道有两种阻止用户调用服务的方法:关闭InstanceContext对象(通过OperationContext.Current)或在服务处于故障状态时引发IDispatchMessageInspector.AfterReceiveRequest异常。这两种方式的问题在于,在我重新启动服务器/应用程序池(我不能,请参阅下面的注释)或重新部署服务之前,它们会使服务不可用。

重要说明:尽管我具有完全信任,但该服务当前托管在共享服务器上,因此我无法重新启动服务器或整个应用程序池(如果可能),因为这也会重新启动其他人的服务。

更新:

我尝试按照@usr的建议卸载 AppDomain,但这不起作用:卸载后,每次调用服务都会引发异常。

目前,我正在尝试找出WCF/IIS使用什么作为决定是否应再次创建服务的条件。我注意到在为客户端生成的代码中检查是否有任何通道可用于与服务通信;如果没有,则创建一个新的。因此,我尝试关闭服务中的所有通道:我尝试关闭OperationContext.Current.InstanceContext.OutgoingChannelsOperationContext.Current.InstanceContext.IncomingChannelsOperationContext.Current.Channel 以及名称中带有"Channel"的许多其他属性,但都没有成功。

WCF 服务是否可以重新启动自身

7.5 版之前的 IIS 中预热任何内容的方法是使用计划的控制台应用程序对您的网站/服务进行 ping 并预热它们。这不是一个好的解决方案,但它有效,很容易,我在必须处理此要求的每个项目中都看到了它。

或者,如果您使用的是 IIS 7.5,则您可以使用Windows Server AppFabric,它具有自动统计功能,以保持服务始终打开。但是您需要IIS 7.5才能安装App Fabric