Что на самом деле делает OperationContext.Current.GetCallbackChannel? - PullRequest
7 голосов
/ 03 июля 2010

Что на самом деле делает OperationContext.Current.GetCallbackChannel? Как он идентифицирует каждого клиента?

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

Например, если A, B, C, D присоединяются к услуге, если я отправляю изменения в C и D с помощью обратного вызова, она отправляется на B.

Есть идеи?

Подробнее :

Клиент: веб-приложение ASP.NET

Связывание: netTCPBinding

Update1

Хорошо, я нашел причину проблемы. Я размещал клиента asp.net в IIS. Например, URL-адрес клиента: http://url1. Если я открываю несколько экземпляров страницы на другом компьютере и присоединяюсь к услуге, канал обратного вызова всегда указывает на первый экземпляр страницы (я открываю сайт с разных компьютеров ). Но если я размещаю клиента asp.net под разными сайтами в IIS, каналы обратного вызова уникальны. Есть мысли по этому поводу?

Ответы [ 2 ]

6 голосов
/ 05 июля 2010

Когда служба получает вызов, OperationContext.Current.GetCallbackChannel возвращает канал только этому вызывающему. Он не возвращает канал, транслирующий всем клиентам.

Исходя из вашего вопроса, возможно, вы сохраняете только тот ответный вызов, который был получен при последнем вызове. Вы на самом деле должны хранить список, содержащий каждый уникальный экземпляр обратного вызова, который был получен. Каждый раз, когда вызывается метод, вы добавляете экземпляр обратного вызова в этот список. Если вы хотите вещать, вам нужно пройтись по каждому элементу в списке и сделать необходимый вызов.

Если ваша служба использует режим экземпляра Singleton, объект реализации может сохранить список экземпляров обратного вызова в качестве члена данных. Если ваша служба использует режим экземпляра Client или SingleCall, то у вас может быть глобальный объект, содержащий список экземпляров обратного вызова.

1 голос
/ 03 июля 2010

Вы должны настроить свой сервис, чтобы создать отдельный поток для каждого сеанса. Взгляните на http://msdn.microsoft.com/en-us/library/cc681240.aspx

...