Как бороться с ошибочным состоянием в дуплексной службе WCF с включенными сеансами - PullRequest
0 голосов
/ 10 августа 2011

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

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

Моя проблема с этим подходом состоит в том, что на сервере существует один сеанс на каждого клиента, и у каждого клиента есть только один экземпляр прокси службы (прокси-сервер синглтона).Поскольку это дуплекс, на стороне клиента несколько объектов прослушивают события в этом экземпляре службы (сообщения, отправленные с сервера клиенту).Если служба находится в неисправном состоянии, она больше не может быть использована.Если я отбрасываю этот экземпляр и создаю новый, мне трудно снова подключить все обработчики событий к этому новому экземпляру.

Должен ли я обернуть службу и каждый раз, когда объект подключается длясобытие, сохранить обработчик в списке (чтобы я мог перехватить его при повторном создании службы)?Кажется, что утерян код, легко утечка памяти ...

Есть ли способ просто перезапустить клиентский прокси / канал, не отбрасывая весь экземпляр прокси?(Я использую прокси сгенерированный VS)

Есть идеи?

Спасибо, MAB

1 Ответ

2 голосов
/ 10 августа 2011

Вы не можете перезапустить прокси. Единственное восстановление из неисправного состояния - прерывание текущего экземпляра и воссоздание нового. На стороне клиента вы должны правильно отменить регистрацию всего, что зависит от вашего прокси-экземпляра, создать новый экземпляр и зарегистрировать все заново. Вся эта операция должна произойти, как только вы получите исключение о канале в неисправном состоянии (= при попытке вызвать службу). После отдыха необходимо снова позвонить в службу.

На стороне службы экземпляр либо уже мертв (что вызвало ошибочное состояние канала), либо он умрет после истечения времени ожидания сеанса. Вы также должны обработать сбойное исключение, когда вы пытаетесь отозвать ответный канал, удалив канал из ваших известных клиентов и отменив регистрацию всего, что зависит от этого канала.

...