Нужен ли открытый канал для дуплексной связи? - PullRequest
2 голосов
/ 26 декабря 2008

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

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

Поэтому я вызываю ChannelFactory.Open, чтобы открыть канал и выполнить дуплексную операцию (односторонняя операция, которая позднее вызывает обратный вызов). Должен ли я закрыть этот канал, вызвав ChannelFactory.Close после того, как я запросил операцию, и если я это сделаю, получу ли я обратный вызов?

Базовое тестирование указывает на то, что я получу обратный вызов, если закрою соединение, однако я просто хочу быть уверен. Также корректен ли этот метод кэширования ChannelFactory?

Спасибо

1 Ответ

4 голосов
/ 26 декабря 2008

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

Вот цитата из замечательной книги Юваля Лоуи «Программирование служб WCF» (предлагаю прочитать всю главу об обратных вызовах):

5.3.4. Управление соединениями обратного вызова

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

...