2011-03-03 131 views
0

我正在创建一个使用WCF双工回调的客户端服务应用程序。该服务将消息发送给所有连接的客户端。我将所有连接的客户端存储在字典中。在发送消息给客户端之前,我想检查是否有客户端异常关闭(网络断开,关闭电源)。检查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

@marc_s:我创建了一个CheckCallbackChannels方法,它将检查字典中连接客户端的所有通信状态状态。 – AKP 2011-03-04 04:50:12

回答

2

是的,您可以在每个服务合同中包含一个Ping()方法,并在实际调用之前调用该方法。

但是,这真的告诉你什么?

首先,即使对.Ping()的调用可能会导致异常(因为服务已经消失,超载等等)。

如果它成功了 - 它可以让你绝对不能保证,你对同样的服务下一个电话,一微秒后,有成功的任何机会....

基本上,我觉得这种做法浪费 - 你需要编写大量的代码,最终,它确实不会给你任何有意义的信息。

你需要做的是:准备服务调用它可以失败 - 无论出于何种原因。不要浪费你的时间和处理周期在你的系统周围进行ping - 无论如何它不会给你任何有意义的信息。

只需进行服务调用,准备好处理故障(并可能回收您的WCF代理) - 这就是您真正可以做的。