2015-06-07 3 views
0

Я строю простой сервис wcf duplex. В этой службе клиенты отправляют сообщения на сервер, и сервер распространяет это сообщение всем подключенным клиентам. Однако, несмотря на то, что я определил атрибут ServiceBehavior как [ServiceBehavior (InstanceContextMode = InstanceContextMode.Single)], только клиент, который отправил сообщение, получает его обратно с сервера, а другие клиенты этого не делают. Я проверил, что есть только один экземпляр сервера. Что я сделал не так? Я просмотрел другие подобные вопросы в Интернете, и все они говорят, что я должен определить InstanceContextMode = InstanceContextMode.Single, что я уже сделал.Как использовать двустороннюю службу wcf для распространения сообщений всем клиентам?

+0

покажите нам, как вы отправляете сообщение обратно. Убедитесь, что вы отправляете его всем подключенным клиентам. Вы могли бы заставить их вызвать метод регистрации и сохранить список на сервере и зацикливать список. –

+0

Очевидно, что SignalR предназначен только для таких случаев. Это будет слишком сложно для WCF. –

+0

Вот как я отправляю сообщения: IMessageServiceCallback callback = OperationContext.Current.GetCallbackChannel (); callback.SendMessage (сообщение); Я также попытался иметь отдельный объект обратного вызова для каждого пользователя и перебрать все эти объекты, но он тоже не работает. – user207809

ответ

1

У вас есть договор обратного вызова. Так что сервер ответит клиенту. Ознакомьтесь с нижеприведенным руководством по выполнению договора обратного вызова Click here

Также проверьте приведенный ниже сервер уведомления о событиях проекта. Этот проект делает то же, что и вы.

CodeProject Link

Не стесняйтесь спрашивать меня, если вам нужно больше разъяснений

Вы должны поддерживать clistList, как показано на фрагменте кода.

List<IMessageServiceCallback> clientList = new List<IMessageServiceCallback>(); 
public void Register() 
{ 
    IMessageServiceCallback callback = OperationContext.Current.GetCallbackChannel<IMessageServiceCallback>(); 
    clientList.add(callback); 
} 

Если вы хотите передать это сообщение. Вы можете выполнить итерацию по списку и вызвать функцию обратного вызова для отправки сообщения клиентам.

+0

, конечно, я определил контракт. Здесь: [ServiceContract (CallbackContract = TypeOf (IMessageServiceCallback))] общедоступный интерфейс IMessageService { [OperationContract (IsOneWay = истина)] недействительными SendMessage (строка с); } общедоступный интерфейс IMessageServiceCallback { [OperationContract (IsOneWay = истина)] недействительными SendMessage (строка с); } – user207809

+0

Поддерживаете ли вы экземпляр экземпляра всех клиентов в списке или массиве? Список clientList = новый список (); public void Register() { IMessageServiceCallback callback = OperationContext.Current.GetCallbackChannel (); clientList.add (обратный вызов); } – kalidoss

+0

Большое спасибо. Я посмотрел ссылки, и мне удалось реализовать услугу, которую я хотел. Короче говоря, мне нужно иметь объект обратного вызова для каждого подключенного клиента. Затем я перебираю все эти объекты, чтобы отправлять сообщения всем подключенным клиентам. – user207809

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