2010-11-30 4 views
16

У меня есть собственная служба 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. Ницца.

+0

посмотреть на это у меня такая же проблема http://stackoverflow.com/questions/3986347/wcf-duplex-retrieve-client-connection – Rev 2011-02-26 08:53:45

ответ

2

Я пошел с Abort-подхода. Это казалось самым логичным методом, и он работает очень хорошо. Клиент получает уведомление с Faulted-событием в callback-instancecontext.

1

Вы можете просто выполнить обратный вызов непосредственно перед закрытием канала обратного вызова, сообщающего клиенту, что вы закрываете канал.

Так что перед этой строкой кода:

((ICommunicationObject)client.CallbackChannel).Close(); 
+0

Это не работает – Sentry 2017-09-28 16:32:37