我目前正在开发一个WCF服务,它保存并处理应用程序的所有数据,而MySql数据库用于持久化。该服务当前作为单例(InstanceContextMode.Single
)工作,并支持多个并发调用(ConcurrencyMode.Multiple
)。我不确定托管服务的IIS版本,但我相信它是IIS 7.5。
问题在于,在某些情况下,如果发生异常(例如:在释放ReaderWriterLockSlim
锁定时),服务将处于不可靠状态,数据可能会被破坏(并写入数据库)如果用户继续调用该服务。
目前,我知道阻止用户调用服务的两种方法:关闭InstanceContext
对象(通过OperationContext.Current
)或在IDispatchMessageInspector.AfterReceiveRequest
中引发异常(如果服务位于故障状态。这两种方式的问题在于,在我重新启动服务器/应用程序池(我不能,请参阅下面的注释)或重新部署服务之前,它们使服务不可用。
重要说明:虽然我有完全信任,但该服务当前托管在共享服务器上,因此我无法重新启动服务器或整个应用程序池(如果可能),因为这将重新启动其他人的服务好。
我尝试将AppDomain卸载为@usr建议,但这也不起作用:卸载后,每次调用该服务都会引发异常。
目前,我正在尝试找出WCF / IIS用作决定是否应再次创建服务的条件。我注意到在为客户端生成的代码中检查是否有可用于与服务通信的通道;如果没有,则创建一个新的。因此,我尝试关闭服务中的所有频道:我尝试关闭OperationContext.Current.InstanceContext.OutgoingChannels
,OperationContext.Current.InstanceContext.IncomingChannels
,OperationContext.Current.Channel
以及其名称中包含“频道”的许多其他媒体资源,所有频道都没有成功。
答案 0 :(得分:0)
在版本7.5之前预热IIS中的任何内容的方法是使用预定的控制台应用程序来ping您的网站/服务并对其进行预热。这不是一个好的解决方案,但它很有效,很容易,我在每个必须处理这个要求的项目上看到它。
或者如果您使用的是IIS 7.5
您可以使用Windows Server AppFabric
,它具有自动统计功能以始终保持服务。但您需要IIS 7.5
才能安装App Fabric
。