Идентификация клиентов в сервисе WCF - PullRequest
6 голосов
/ 02 сентября 2011

У меня есть работающий дуплексный сервис WCF с WSDualHttpBinding. Моя проблема заключается в поиске способа сохранить канал обратного вызова с уникальным идентификатором. Сервис предназначен для долгосрочной работы. Могу ли я просто получить возвращаемое значение OperationContext.Current.GetCallbackChannel() при вызове метода «Подписаться» и сохранить его в списке или словаре? Гарантирован ли он действителен до тех пор, пока соединение не будет активным?

1 Ответ

5 голосов
/ 03 сентября 2011

Самый простой способ - это указать клиенту значение ключа в методе 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;
        }

    }
...