Я строю простой сервис wcf duplex. В этой службе клиенты отправляют сообщения на сервер, и сервер распространяет это сообщение всем подключенным клиентам. Однако, несмотря на то, что я определил атрибут ServiceBehavior как [ServiceBehavior (InstanceContextMode = InstanceContextMode.Single)], только клиент, который отправил сообщение, получает его обратно с сервера, а другие клиенты этого не делают. Я проверил, что есть только один экземпляр сервера. Что я сделал не так? Я просмотрел другие подобные вопросы в Интернете, и все они говорят, что я должен определить InstanceContextMode = InstanceContextMode.Single, что я уже сделал.Как использовать двустороннюю службу wcf для распространения сообщений всем клиентам?
ответ
У вас есть договор обратного вызова. Так что сервер ответит клиенту. Ознакомьтесь с нижеприведенным руководством по выполнению договора обратного вызова Click here
Также проверьте приведенный ниже сервер уведомления о событиях проекта. Этот проект делает то же, что и вы.
Не стесняйтесь спрашивать меня, если вам нужно больше разъяснений
Вы должны поддерживать clistList, как показано на фрагменте кода.
List<IMessageServiceCallback> clientList = new List<IMessageServiceCallback>();
public void Register()
{
IMessageServiceCallback callback = OperationContext.Current.GetCallbackChannel<IMessageServiceCallback>();
clientList.add(callback);
}
Если вы хотите передать это сообщение. Вы можете выполнить итерацию по списку и вызвать функцию обратного вызова для отправки сообщения клиентам.
, конечно, я определил контракт. Здесь: [ServiceContract (CallbackContract = TypeOf (IMessageServiceCallback))] общедоступный интерфейс IMessageService { [OperationContract (IsOneWay = истина)] недействительными SendMessage (строка с); } общедоступный интерфейс IMessageServiceCallback { [OperationContract (IsOneWay = истина)] недействительными SendMessage (строка с); } – user207809
Поддерживаете ли вы экземпляр экземпляра всех клиентов в списке или массиве? Список
Большое спасибо. Я посмотрел ссылки, и мне удалось реализовать услугу, которую я хотел. Короче говоря, мне нужно иметь объект обратного вызова для каждого подключенного клиента. Затем я перебираю все эти объекты, чтобы отправлять сообщения всем подключенным клиентам. – user207809
покажите нам, как вы отправляете сообщение обратно. Убедитесь, что вы отправляете его всем подключенным клиентам. Вы могли бы заставить их вызвать метод регистрации и сохранить список на сервере и зацикливать список. –
Очевидно, что SignalR предназначен только для таких случаев. Это будет слишком сложно для WCF. –
Вот как я отправляю сообщения: IMessageServiceCallback callback = OperationContext.Current.GetCallbackChannel(); callback.SendMessage (сообщение); Я также попытался иметь отдельный объект обратного вызова для каждого пользователя и перебрать все эти объекты, но он тоже не работает. –
user207809