Восстановить канал обратного вызова после создания CommunicationObjectAbortedException

У нас есть архитектура (несколько) клиентов-(один) сервер для настольной игры в покер. Мы используем уведомления обратного вызова, используя каналы обратного вызова.

Но иногда из-за обрывов интернет-соединения этот конкретный клиент отключается от сервера, и канал WCF этого конкретного клиента также переходит в ошибочное состояние, и его канал обратного вызова, который находится на сервере, также нарушается.

Сценарий:

Этот клиент играет в игру, в то время как интернет-соединение обрывается, эта игра останавливается, но его игровое окно остается открытым, и когда его/ее интернет-соединение восстанавливается, этот клиент отключается от сервера, но игровое окно этого игрока все еще открывается, и этот игрок может ничего не делать, так как его/ее канал WCF отключен.

Мы хотим закрыть окно этого конкретного клиента, пока он/она отключается от сервера и генерирует исключение 'CommunicationObjectAbortedException'.

Мы не можем использовать канал обратного вызова предыдущего канала WCF, так как он находится в ошибочном состоянии. Итак, мы попытались создать новый callbackChannel на сервере при удалении, используя следующий код:

OperationContext.Текущий.GetCallbackChannel();

но здесь Current показывает «NULL», поскольку канал WCF этого игрока прерван, поэтому выдается ошибка, что «Ссылка на объект не установлена ​​​​на экземпляр объекта».

Итак, есть ли какое-либо решение для использования канала обратного вызова прерванного канала WCF или восстановления этого канала WCF без их повторной инициализации или для вызова этого клиента с использованием нового канала?


person KomalJariwala    schedule 23.10.2013    source источник


Ответы (1)


Я бы попробовал следующее:

  1. На стороне сервера при попытке связи с использованием неисправного / прерванного канала - вы потерпите неудачу. Перехватите этот сбой и удалите его обратный вызов из списка (я полагаю, вы управляете каким-то списком обратных вызовов).

  2. На стороне клиента - когда канал неисправен / ... обработан - попробуйте повторно открыть новый канал на сервере. Когда этот новый канал будет открыт, на стороне сервера поместите этот новый обратный вызов в список «действительных обратных вызовов».

person evgenyl    schedule 20.11.2013