我正在使用WCF双工回调创建客户端服务应用程序。该服务将消息发送到所有连接的客户端。我将所有连接的客户端存储在字典中。在向客户端发送消息之前,我想检查是否有任何客户端异常关闭(网络断开,断电)。
@marc_s:我创建了一个CheckCallbackChannels方法,该方法将检查字典中连接客户端的通信状态。
Sub CheckCallbackChannel()
For Each objClient As KeyValuePair(Of Guid, IClientCallBack) In MainService.objClients
Dim objClientCallBack As IClientCallBack = MainService.objClients.Item(objClient.Key)
Dim callbackChannel As ICommunicationObject = TryCast(mobjClientCallBack,ICommunicationObject)
'Dim state As CommunicationState = callbackChannel.State
If callbackChannel.State = CommunicationState.Opened OrElse callbackChannel.State = CommunicationState.Faulted Then
MainService.objClients.Remove(objClient.Key)
End If
Next
End Sub
但是在这里我也将错误的客户连接到了状态。
答案 0 :(得分:2)
是的,您可以在每个服务合同中加入Ping()
方法,并在实际通话前致电。
但这真的告诉你什么?
首先,即使调用.Ping()
也可能导致异常(因为服务已经消失,过载,无论如何)。
如果成功 - 它绝对无保证你下次拨打同样的服务,一秒后,有机会成功......
基本上,我觉得这种方法很浪费 - 你需要编写很多代码,最后,它确实没有给你任何有意义的信息。
您需要做的是:在每次服务电话上准备它可能会失败 - 无论出于何种原因。不要浪费你的时间和处理周期在你的系统上乱逛 - 它无论如何都不会给你任何有意义的信息。
只需进行服务调用,准备好处理失败(并可能回收你的WCF代理) - 这就是你真正能做到的。