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