WCF - 客户端回调与"保留订阅者列表"的轮询

Chr*_*ert 7 .net c# wcf

我想在WCF中创建一个简单的客户端 - 服务器示例.我做了一些回调测试,到目前为止工作正常.我用以下界面玩了一下:

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IStringCallback))]
public interface ISubscribeableService
{
    [OperationContract]
    void ExecuteStringCallBack(string value);

    [OperationContract]
    ServerInformation Subscribe(ClientInformation c);

    [OperationContract]
    ServerInformation Unsubscribe(ClientInformation c);
}
Run Code Online (Sandbox Code Playgroud)

这是一个简单的例子.稍微调整一下.您可以要求服务器"执行字符串回调",在这种情况下,服务器会反转字符串并调用所有已订阅的客户端回调.

现在,问题出现了:如果我想实现一个所有客户端都"注册"服务器的系统,并且服务器可以"询问"客户端是否还活着,你会用回调来实现吗(所以不要这样做"stringcallback"是一种TellTheClientThatIAmSti​​llHereCallback).通过检查回调上的通信状态,我也可以"知道"客户端是否已经死亡.与此类似的东西:

Subscribers.ForEach(delegate(IStringCallback callback)
                    {
                        if (((ICommunicationObject)callback).State == CommunicationState.Opened)
                        {
                            callback.StringCallbackFunction(new string(retVal));
                        }
                        else
                        {
                            Subscribers.Remove(callback);
                        }
                    });
Run Code Online (Sandbox Code Playgroud)

我的问题,换句话说:

  • 服务器可能有3个客户端
  • 客户A死了(我拉了笔记本电脑的插头)
  • 服务器死机并重新上线
  • 一个新客户出现了

所以基本上,你会使用回调来验证客户的"仍然生存状态",或者你会使用民意调查并跟踪"我没听说过客户多久"......

Sak*_*o73 0

我在使用 WCF 和回调时遇到了类似的情况。我不想使用轮询,但我使用的是“可靠”协议,因此如果客户端死亡,那么它会挂起服务器直到超时并崩溃。

我不知道这是否是最正确或最优雅的解决方案,但我所做的是在服务中创建一个类来表示客户端代理。此类的每个实例都包含对客户端代理的引用,并且每当服务器设置该类的“消息”属性时就会执行回调函数。通过这样做,当客户端断开连接时,单个包装类将获得超时异常,并将其自身从服务器的侦听器列表中删除,但服务不必等待它。这实际上并不能回答您关于确定客户端是否还活着的问题,但它是构建服务来解决问题的另一种方式。如果您需要知道客户端何时死亡,您可以了解客户端包装器何时从侦听器列表中删除自身。