一般检测客户端断线重连的方法都是使用心跳检测。然而增加心跳检测将会稍微影响系统的性能,总之这点资源开销的瑕疵对于有强迫症的我来说有点难接受。在WCF里面其实可以实现客户端断线检测,而不需要心跳。
首先我要声明,这个方法值适用于WCF服务的会话模式。相信一些资深WCF玩家已经猜到我要说的了。下面我来讲解下
1、在基于会话模式的WCF服务中,每一个客户端的连接信道都会有一个ID标示,通过它WCF服务可以甄别不同客户端,从而为每个不同客户端创建一个会话通道。
//这里我们先对契约借口属性进行设置。
[ServiceContract (CallbackContract = typeof(ICalculatorCallback),SessionMode =SessionMode.Required)]
2、每一个客户端连接的时候。WCF服务都会创建一个InstanceContext实例上下文,它与客户端同生存周期。每一次创建实例上下文的时候,服务类(就是契约借口的实现类)就会被重新创建(准备的说是重新调用其构造函数)实例消亡时候会自动进行垃圾回收。如下代码:
[ServiceBehavior(InstanceContextMode =InstanceContextMode.PerSession)]