0

我正在使用 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

但在这里我也得到了错误客户端的连接状态。

4

1 回答 1

2

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

但这真的告诉你什么?

首先,即使是对的调用也.Ping()可能导致异常(因为服务消失、过载等等)。

如果它成功了——它绝对不能保证你对同一服务的下一次调用,一微秒后,有任何成功的机会......

基本上,我觉得这种方法很浪费——你需要写很多代码,最后,它真的没有给你任何有意义的信息。

您需要做的是:为每次可能失败的服务调用做好准备——无论出于何种原因。不要浪费你的时间和处理周期在你的系统中到处寻找——它无论如何都不会给你任何有意义的信息。

只需拨打您的服务电话,准备好处理故障(并可能回收您的 WCF 代理) - 这就是您真正能做的。

于 2011-03-03T08:00:17.160 回答