2010-07-03 3 views
7

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

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

Для ех, если A, B, C, D соединяет службу, если я отправить изменения в C и D через обратный вызов он собирается В.

Любые идеи?

Детали:

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

Переплет: NetTcpBinding

Update1

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

+3

Я уже говорил вам, что то, что вы делаете, не будет работать. Этот комментарий не для вас - это для других, кто читает его позже. Не делайте **, ** когда-либо ** пытайтесь перезвонить или ссылаться на страницу ASP.NET после завершения запроса. Страница не будет существовать. –

+1

Спасибо за ваш комментарий Джон. Я просто копался в том, как работает обратный вызов. Все, что вы сказали уже **, имеет смысл **. Я не пытаюсь больше в том же направлении. – NLV

ответ

6

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

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

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

+0

Да. Вот как я это делаю. Я использую [ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)] для моей службы. Но я все еще получаю ту же проблему. Теперь я создал словарь для хранения обратных каналов. Однако все обратные каналы для пользователей, подключенных после второго пользователя (от третьего пользователя), всегда указывают на второго пользователя. Я следую этой замечательной статье - http: // www.codeproject.com/KB/WCF/WCFWPFChat.aspx от Sacha Barber. – NLV

+0

Является ли это «OperationContext.Current.GetCallbackChannel» основан на прокси-объекте, который я использую для вызова службы от клиента? – NLV

+0

Обновлено мое сообщение. Пожалуйста, проверь это. – NLV

1

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

+0

Да, я знаю это. Я настроил режим сеанса и контекст экземпляра и другие конфигурации, необходимые для создания дуплексного контракта с обратным вызовом. Весь мой вопрос в том, как он создает канал с клиентом? – NLV

Смежные вопросы