У меня есть собственная служба WCF с net.tcp DuplexChannel. На сервере я бегу следующее отключить клиента:WCF: Как обнаружить клиентскую сторону, если сервер отключает меня
((ICommunicationObject)client.CallbackChannel).Close();
Это прекрасно работает, но как я могу обнаружить на клиенте, что он был отключен?
Ive зацепил до ЗАКРЫТ и неисправных-событий на обоих InstanceContext обратного вызова и канал на сервер:
InstanceContext callback = new InstanceContext(callbackImp);
callback.Closed += new EventHandler(callback_Closed);
и
((ICommunicationObject)Channel).Closed += new EventHandler(Channel_Closed);
Но ничего не работает. Я никогда не получаю уведомление. Обходной путь Im, используемый сейчас, заключается в том, чтобы иметь метод в обратном вызове, который вместо этого отключает соединение с клиентской стороны. Но я предпочитаю не делать этого таким образом. Я особенно не хочу, чтобы сервер ожидал отключения пользователя.
EDIT
Я просто понял, что при отсоединении от клиентской стороне я бегу метод в сервис-контракт, который отмечается с IsTerminating = TRUE:
[OperationContract(IsTerminating = true)]
void Disconnect();
Я полагал, что это будет то же самое в callback-контракте? Я попытался добавить один и тот же метод, чтобы мой обратный вызов, и он сделал прекратить обратный вызов-канал с точки зрения сервера, но я все еще не получил уведомление на стороне клиента ... странно
EDIT
I обнаружили еще некоторую информацию об этом:
Когда сервер прерывает канал обратного вызова , неисправность перемещается обратно клиент , недостатки клиента, и мы получаем это событие Faulted на клиенте.
Когда сервер закрывает обратный вызов , сеанс по-прежнему открыт , пока клиент не выйдет из строя.
Как только клиент закроет канал , вы увидите закрытое событие.
В соответствии с этим утверждением закрытое событие не запускается без задержек, закрывая канал обратного вызова с сервера, и клиент должен его закрыть. Поэтому я мог запустить Close на клиенте в завершающем Disconnect-методе обратного вызова. Или я мог бы использовать метод Abort на стороне обратного вызова и пропустить с помощью метода Disconnect для обратного вызова. Я не знаю, какой из них я предпочитаю честно. Хммм.
EDIT
Я пошел с Abort-подхода. Это казалось самым логичным методом, и он работает очень хорошо. Клиент получает уведомление с Faulted-событием в callback-instancecontext. Ницца.
посмотреть на это у меня такая же проблема http://stackoverflow.com/questions/3986347/wcf-duplex-retrieve-client-connection – Rev 2011-02-26 08:53:45