2016-01-21 3 views
2

У меня есть сервер WCF, который поддерживает ссылку на обратный вызов клиента с использованием дуплексной модели.Закрытие WCF-клиента

Если я явно закрыть соединение обратного вызова на сервере:

ICallBack callBack = OperationContext.Current.GetCallbackChannel<ICallBack>(); 
callBack.Close() 

клиент не получит уведомление об этом событии через подписку на любой из:

client.InnerChannel.Closed += Handler; 
client.InnerDuplexChannel.Closed += Handler; 

Ни обработчик события выполняется.

Однако, если изменить функцию обратного вызова к Abort вместо Close на стороне сервера, клиент получает уведомление о Faulted обработчика, а затем впоследствии Closed обработчик. Таким образом, прерывание работы, как и ожидалось.

Я проверил обратный вызов в допустимом состоянии, так почему это клиент получающего Faulted уведомление о Abort и НЕ Closing уведомления о Close? Состояние обратного вызова после Close - Closed.

В соответствии с MSDN documentation изящно закрывающее соединение обратного вызова с использованием Close было бы моим предпочтительным выбором по сравнению с более резким Abort.

ответ

0

, потому что вы применяете это к своему интерфейсу, который, как я предполагаю, реализует Close(), что не является чем-то, что приведет к событию WCF.

Вы должны сделать это:

IClientChannel pClientChannel = (IClientChannel) callback; 
pClientChannel.Close(); 

что упрощено. Вы действительно должны сделать шаблон try/catch Close/Abort. Если закрытие не работает, вызовите его.