2015-06-21 75 views
1

我目前正在研究一个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”的属性,所有这些属性都没有成功。

+1

是否托管在IIS中?因为这种管理不是服务本身的任务,而是托管过程。 –

+1

为什么使用单实例模式? –

+0

@亨克是的,它托管在IIS上。而选择使用单一实例模式的设计是:应用程序是一个小游戏,服务负责保持世界状态并处理其上的每个操作。 –

回答

0

预热7.5版本之前的任何IIS的方法是使用预定的控制台应用程序来ping您的网站/服务并预热它们。这不是一个很好的解决方案,但它很有用,很简单,我在每个需要处理这个需求的项目上都看到了它。

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

+0

问题并不在于如何将服务加热。考虑一下:服务已经在运行,然后在临界点处未处理异常。从现在开始,我不能让用户在服务中执行任何其他操作,因为数据可能会损坏并写入数据库;我需要重新启动该服务,以便下次调用该服务时创建一个新实例(就像上载后第一次调用该服务一样)。 –

相关问题