2015-03-03 6 views
1

У меня есть служба WCF, размещенная внутри службы Windows. и я использую NetTcpBinding для подключения клиентского приложения WPF к этой службе. У меня есть контракт обратного вызова, чтобы разрешить push-уведомления клиенту, который работает нормально, за исключением случаев, когда на одном компьютере работает несколько клиентов (например, два экземпляра клиента, работающие в отдельных сеансах удаленного рабочего стола). В этих обстоятельствах кажется, что только один из клиентов получает сообщения обратного вызова. Похоже, что проблема вызвана двумя клиентами, которые разоблачают один и тот же адрес обратного вызова, поэтому сообщение отправляется только одному из слушателей.WCF NetTcpBinding callback с несколькими клиентами на одном компьютере

Например, у меня есть служба WCF, размещенная на компьютере «fakeserver» и 2 клиента WPF, которые работают на компьютере «fakeclient». Адрес, который клиенты используют для подключения к службе WCF, - «net.tcp: // fakeserver: 1234/MyService». Оба клиента могут подключиться к сервису просто отлично. Но когда сервер отправляет обратный вызов, он отправит его в «net.tcp: // fakeclient: 1234/MyCallback» (поскольку NetTcpBinding по умолчанию является дуплексным, нам не нужно указывать отдельный порт для отправки обратных вызовов), который имеет двух разных клиентов, которые прослушивают трафик. Сообщение получает только один из этих клиентов.

Если бы я использовал WSDualHttpBinding, я мог бы указать разные порты для обратного вызова клиента, что сделало бы два обратных вызова клиента уникальными. Тем не менее, я считаю, что оба клиентских обратных адреса одинаковы, поэтому сообщение отправляется только одному клиенту (последний зарегистрирован, как правило).

Как я могу гарантировать, что два (или более) WPF-клиента на одном и том же компьютере обрабатываются отчетливо, и каждый из них получает любые сообщения обратного вызова, нажимаемые службой при использовании NetTcpBinding?

+0

Я смущен. Вы говорите, что вы храните два экземпляра делегата callback в службе, по одному на каждого клиента, и вы вызываете их оба один за другим, но только один клиент принимает вызов? –

+0

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

+0

Просто разверните различные экземпляры клиента из одного сеанса. Почему это необходимо для работы на удаленных сеансах? –

ответ

1

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

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