Почему моя служба Wcf Duplex переходит в сбойное состояние после первого вызова службы? - PullRequest
1 голос
/ 02 марта 2011

Я пытаюсь создать дуплексную службу wcf, в которую регистрируются несколько клиентов. Когда клиент вызывает услугу, другие клиенты получают уведомление о вызове.

Сейчас у меня есть приложение Silverlight, которое вызывает дуплексную службу wcf. При первом звонке все работает правильно, включая дуплексную связь. При втором звонке в сервис я получаю:

The communication object, System.ServiceModel.Channels.ClientPollingDuplexSessionChannel, cannot be used for communication because it is in the Faulted state.

Мой сервис имеет 2 разных метода; Зарегистрируйте Клиента и ReassignOwner. Если я вызываю один и тот же метод дважды или оба метода один раз в любом порядке, я все равно получаю эту ошибку.

После исследования предмета я подумал, что это может быть проблема тайм-аута. Я проверил значение тайм-аута по умолчанию, и оно составляет 10 минут. Я делаю оба звонка в течение 2-3 минут. Я также увеличил тайм-аут неактивности и тайм-аут приема до 4 часов, чтобы быть уверенным, и у меня все еще возникает эта проблема.

Затем я подумал, что мой сервис может генерировать исключение, которое приведет к тому, что клиент перейдет в состояние отказа. Чтобы проверить это, я поместил операторы try / catch в 2 метода моего сервиса и запустил программу в режиме отладки. Я не поймал никаких исключений. Я также попытался закомментировать весь код этих двух методов (чтобы исключение не могло быть сгенерировано) и просто вызвал эти два пустых метода, и я все еще получил исключение.

Прочитав другой пост здесь на SO, я решил попробовать трассировку WCF. Я включил его в своем файле web.config и установил для переключателя значение Warning. Я получаю 2 предупреждения:

Description Faulted System.ServiceModel.Channels.ServicePollingDuplexSessionChannel
Description Faulted System.ServiceModel.Channels.ServiceChannel

Вот как определяется мой сервис в коде файла .svc.cs:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single, AutomaticSessionShutdown = false)] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class NotificationService : BaseService, INotificationDuplexService

В моем контракте на обслуживание оба метода имеют следующие атрибуты:

[OperationContract(AsyncPattern = true, IsOneWay = true,
                   Action = "http://www.abc.org/NotificationDuplex/INotificationDuplexService/MethodName")]

Оба моих метода реализованы асинхронно с методом Begin и End.

Вот как я вызываю мои методы

base.InvokeAsync(this.onBeginRegisterClientDelegate, new object[] {
                    id}, this.onEndRegisterClientDelegate, this.onRegisterClientCompletedDelegate, userState);

Кто-нибудь знает, почему это происходит, или имеет какое-либо представление о том, как я мог бы продолжать пытаться решить эту проблему?

Ответы [ 3 ]

2 голосов
/ 02 марта 2011

Требует ли ваш ServiceContract CallbackContract? Если это так, я предлагаю вам прочитать о повторном входящем вызове здесь - это хорошее описание того, как WCF может заранее сбойить ваши каналы связи, чтобы предотвратить тупик при использовании обратных вызовов, и что вы должны сделать, чтобы предотвратить его .

1 голос
/ 08 декабря 2011

Другое решение, на которое я ссылался, и которое я реализовал сам, - это установить «сердцебиение».Моя конфигурация имеет значение MultipleMessagesPerPoll, и служба продолжает работать без проблем, потому что у меня клиент пингует сервер не реже одного раза в 9 секунд.Это казалось магическим числом - через девять секунд канал отключается и переходит в неисправное состояние.Просто настройте поток для проверки связи с сервисом (используя метод ping или что-то в этом роде), и сервис может ответить клиенту «pong».

Согласитесь, что эта проблема не является проблемой.в Chrome или других браузерах.

0 голосов
/ 04 марта 2011

Наконец, я нашел awnser в аналогичном вопросе: Внутренний канал Silverlight PollingDuplex неисправен с множествомMessagesPerPoll (serverPollTimeout)

Кажется, есть ошибка при установке PollingDuplexHttpBinding для PollingDuplexMode.MerplePessи вы запускаете свое приложение под IE 8 (другие браузеры не затрагиваются).

Решение состоит в том, чтобы поместить PollingDuplexMode в SingleMessagePerPoll, который является менее производительным, но функциональным в IE8.

...