Я пытаюсь создать дуплексную службу 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);
Кто-нибудь знает, почему это происходит, или имеет какое-либо представление о том, как я мог бы продолжать пытаться решить эту проблему?