如何使用WCF netTcpBinding从通信/服务故障中恢复?

如何使用WCF netTcpBinding从通信/服务故障中恢复?,wcf,nettcpbinding,Wcf,Nettcpbinding,我正在开发一个客户端/服务器应用程序,客户端每隔几秒钟调用一次WCF服务。我没有使用IIS-该服务作为控制台应用程序运行(目的是将其作为Windows服务安装在生产系统上) 我从使用basicHttpBinding开始,如果我停止服务(模拟通信/服务器故障),客户端就会通过处理抛出的EndpointNotFoundException忽略它无法连接到服务的事实。重新启动服务后,客户端可以再次开始调用它,一切正常 我现在已经切换到使用netTcpBinding,这次当我停止服务时,它的控制台窗口需要

我正在开发一个客户端/服务器应用程序,客户端每隔几秒钟调用一次WCF服务。我没有使用IIS-该服务作为控制台应用程序运行(目的是将其作为Windows服务安装在生产系统上)

我从使用basicHttpBinding开始,如果我停止服务(模拟通信/服务器故障),客户端就会通过处理抛出的
EndpointNotFoundException
忽略它无法连接到服务的事实。重新启动服务后,客户端可以再次开始调用它,一切正常

我现在已经切换到使用netTcpBinding,这次当我停止服务时,它的控制台窗口需要一段时间才能关闭(可能是由于TCP管理连接的方式,最终超时)。此时,客户端将获得一个
通信异常
(“套接字连接已中止”)。当我重新启动服务时,客户端无法像使用basicHttpBinding那样“恢复”。每次尝试调用服务时,它都会抛出一个
通信对象FaultedException
(“通信对象System.ServiceModel.Channels.ServiceChannel无法用于通信,因为它处于故障状态。”)


我将如何构建某种恢复/恢复行为,类似于我在basicHttpBinding中看到的行为?

您不能重用通道,因为它出现了故障。您应该将客户端强制转换为ICommunicationObject,并调用Abort()进行清理

之后,您只需通过创建新的客户端通道重新开始。如果您的服务器停机一段时间,您可能希望在计时器上执行此操作