识别WCF服务中的客户端

识别WCF服务中的客户端,wcf,service,duplex,Wcf,Service,Duplex,我有一个双工WCF服务,带有WSDualHttpBinding。我的问题是找到一种方法来存储具有唯一id的回调通道。该服务旨在长期运行。调用“Subscribe”方法时,我是否可以简单地获取OperationContext.Current.GetCallbackChannel()返回值并将其存储在列表或字典中?在连接处于活动状态之前,它是否保证有效?最简单的方法是让客户端在服务的Subscribe方法中提交一个键值。然后可以将回调通道保存在字典中。此字典可能需要是一个静态变量或单例类,其生命周期

我有一个双工WCF服务,带有
WSDualHttpBinding
。我的问题是找到一种方法来存储具有唯一id的回调通道。该服务旨在长期运行。调用“Subscribe”方法时,我是否可以简单地获取
OperationContext.Current.GetCallbackChannel()
返回值并将其存储在列表或字典中?在连接处于活动状态之前,它是否保证有效?

最简单的方法是让客户端在服务的Subscribe方法中提交一个键值。然后可以将回调通道保存在字典中。此字典可能需要是一个静态变量或单例类,其生命周期大于服务类的生命周期,因为大多数服务类都有PerCall生命周期,并在服务调用完成后被丢弃。小心线程问题

回调通道随时可能在客户端或服务端出现故障。服务必须处理故障通道的可能性,并从字典中删除故障通道。WSDualHttpBinding是一种“无状态”绑定,因此在服务端尝试调用客户端中的任何错误之前,不会在服务端检测到这些错误。如果客户端进入故障状态,NetTcpBinding将引发ChannelFaulted事件。因此,如果符合您的要求,我建议使用NetTcpBinding

public bool Subscribe(string id) {
        ICallback callback = OperationContext.Current.GetCallbackChannel();
        if (!_activeCallbackChannels.Contains(id)) {
            _activeCallbackChannels.Add(id, callback);
            return true;
        }
        else {
            return false;
        }

    }