2010-05-06 3 views
1

Voici ce que j'ai jusqu'à présent:Comment puis-je pousser une chaîne d'un client connecté à un service WCF à un autre également connecté?

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); 
    } 
} 

Service:

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>(); 

     } 
    } 
} 

Juste une simple chaîne passée d'un client à l'autre.

Répondre

1

Vous ne pouvez pas "pousser" activement une chaîne d'un client WCF à un autre - sauf si vous utilisez la liaison d'égal à égal. Mais ce que vous essayez de faire ressemble un peu au modèle de publication/abonnement: un noeud publie des informations (le serveur - peut-être l'obtenir de l'un des clients), et un nombre quelconque d'abonnés alors recevoir cette information.

Il y a plusieurs approches dans WCF pour ce faire - communication duplex, MSMQ ou messagerie Windows Azure ServiceBus - les approches sont assez variées.

Voici quelques articles avec différentes approches pour vous aider à démarrer:

mais vous trouverez beaucoup plus quand vous recherchez "WCF publish subscribe pattern" sur Google ou Bing.

0

On dirait que vous utilisez déjà la liaison duplex. Gardez simplement une liste de callbacks (abonnés) dans une collection statique (statique car vous utilisez des instances par session). Lorsque quelqu'un appelle "join", parcourez simplement cette collection et appelez UserJoined pour chaque abonné.

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); 
} 
Questions connexes