识别WCF服务中的客户端

时间:2011-09-02 16:55:52

标签: wcf service duplex

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

1 个答案:

答案 0 :(得分:5)

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

回叫频道可以在客户端或服务端随时出现故障。该服务必须处理故障通道的可能性并从字典中删除故障通道。 WSDuallHttpBinding是一个“无状态”绑定,因此在服务端尝试调用它们之前,不会在服务端检测到客户端中的任何故障。如果客户端进入故障状态,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;
        }

    }