Как я могу передать строку от одного клиента, подключенного к службе WCF, к другому, также подключенному? - PullRequest
1 голос
/ 06 мая 2010

Вот что у меня есть:

IService:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace ServiceLibrary
{
    [ServiceContract(SessionMode = SessionMode.Allowed, CallbackContract = typeof(IServiceCallback))]
    public interface IService
    {
        [OperationContract(IsOneWay = false, IsInitiating = true, IsTerminating = false)]
        void Join(string userName);
    }

    interface IServiceCallback
    {        
        [OperationContract(IsOneWay = true)]
        void UserJoined(string senderName);
    }
}

Услуги:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace ServiceLibrary
{
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class Service:IService
    {
        IServiceCallback callback = null;

        public void Join(string userName)
        {
            callback = OperationContext.Current.GetCallbackChannel<IServiceCallback>();

        }
    }
}

Просто простая строка, передаваемая от одного клиента другому.

Ответы [ 2 ]

1 голос
/ 07 мая 2010

Вы не можете активно «проталкивать» строку от одного клиента WCF к другому - если только вы не используете одноранговую привязку.

Но то, что вы пытаетесь сделать, похоже, похоже на модель публикации / подписки: один узел публикует информацию (сервер - возможно, получает ее от одного из клиентов), а затем получает любое количество подписчиков эта информация.

В WCF есть несколько подходов к тому, как это сделать - дуплексная связь, MSMQ или обмен сообщениями в Windows Azure ServiceBus - подходы весьма разнообразны.

Вот несколько статей с различными подходами, с которых можно начать:

, но вы найдете гораздо больше, когда будете искать "Шаблон подписки публикации WCF" в Google или Bing.

0 голосов
/ 07 мая 2010

Похоже, вы уже используете дуплексное связывание. Просто храните список обратных вызовов (подписчиков) в некоторой статической коллекции (статической, потому что вы используете экземпляры для каждой сессии). Когда кто-то звонит «присоединиться», просто выполняйте эту коллекцию и вызывайте UserJoined для каждого подписчика.

private static List<IServiceCallback> subscribers = new List<IServiceCallback>();
public void Join(string userName)
{
    IServiceCallback callback = OperationContext.Current.GetCallbackChannel<IServiceCallback>();
    foreach (var serviceCallback in subscribers)
    {
        serviceCallback.UserJoined(userName);
    }

    subscribers.Add(callback);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...