Самый простой способ - это указать клиенту значение ключа в методе Subscribe вашего сервиса.Затем вы можете сохранить канал обратного вызова в словаре.Этот словарь, вероятно, должен быть статической переменной или одноэлементным классом, срок жизни которого больше, чем срок службы класса обслуживания, поскольку большинство классов обслуживания имеют время жизни PerCall и удаляются после завершения вызова службы.Остерегайтесь проблем с многопоточностью!
Канал обратного вызова может быть поврежден в любое время на стороне клиента или службы.Служба должна обрабатывать возможность неисправного канала и удалять неисправный канал из словаря.WSDuallHttpBinding является привязкой без сохранения состояния, поэтому любые ошибки в клиенте не будут обнаруживаться на стороне службы, пока сторона службы не попытается их вызвать.NetTcpBinding вызовет событие ChannelFaults, если клиент перейдет в состояние с ошибкой.По этой причине я бы порекомендовал NetTcpBinding, если он соответствует вашим требованиям.
public bool Subscribe(string id) {
ICallback callback = OperationContext.Current.GetCallbackChannel();
if (!_activeCallbackChannels.Contains(id)) {
_activeCallbackChannels.Add(id, callback);
return true;
}
else {
return false;
}
}