我目前正在研究一个WCF服务,它为一个应用程序保存并处理所有数据,而一个MySql数据库用于持久化。该服务目前作为单身人士(InstanceContextMode.Single
)并支持多个并发呼叫(ConcurrencyMode.Multiple
)。我不确定服务托管在哪个版本的IIS中,但我相信它是IIS 7.5。WCF服务可以自行重启吗?
问题是,在某些情况下,如果发生异常(例如:在释放ReaderWriterLockSlim
锁时),服务将处于不可靠的状态,并且如果用户保持数据可能会损坏(并写入数据库)致电该服务。
目前我知道阻止用户调用服务的两种方法:如果服务处于故障状态,则关闭InstanceContext
对象(通过OperationContext.Current
)或在IDispatchMessageInspector.AfterReceiveRequest
中引发异常。这两种方式的问题是,他们使服务不可用,直到我重新启动服务器/应用程序池(我不能,请参阅下面的注释)或重新部署该服务。
重要说明:虽然我有Full-Trust,但该服务当前托管在共享服务器上,因此无法重新启动服务器或整个应用程序池(如果可能的话),因为这会重新启动其他人的服务以及。
更新:
我试图卸载的AppDomain作为@usr建议,但是,这并不工作,以及:卸载之后,将引发一个异常每次调用该服务。
目前我试图找出WCF/IIS用作条件来决定是否应该再次创建服务。我注意到,在为客户端生成的代码中检查是否有任何可用于与服务通信的通道;如果没有,则创建一个新的。因此,我试图关闭服务中的所有渠道:我试图关闭OperationContext.Current.InstanceContext.OutgoingChannels
,OperationContext.Current.InstanceContext.IncomingChannels
,OperationContext.Current.Channel
和许多其他名称中带有“Channel”的属性,所有这些属性都没有成功。
是否托管在IIS中?因为这种管理不是服务本身的任务,而是托管过程。 –
为什么使用单实例模式? –
@亨克是的,它托管在IIS上。而选择使用单一实例模式的设计是:应用程序是一个小游戏,服务负责保持世界状态并处理其上的每个操作。 –