2009-07-07 7 views
6

Contexte:WCF: Accès à l'instance de service du serveur

Je dois développer un serveur de surveillance qui surveille certaines de nos applications (ces applications sont en C#). J'ai donc décidé de développer le système avec WCF qui semble adapté à mes besoins.

Ces applications doivent s'inscrire elles-mêmes sur le serveur de surveillance au démarrage. Après cela, le serveur de surveillance peut appeler les méthodes Start ou Stop de ces applications.

Tout est complètement exécuté sur la même machine, rien ne doit être exécuté à distance.

J'ai donc développé un bon prototype et tout fonctionne bien. Chaque application s'enregistre sur le serveur de surveillance.

Question:

ApplicationRegistrationService (voir le code ci-dessous) est la mise en œuvre du service de surveillance et il est une instance singleton en raison de l'attribut ServiceBehavior.

Voici mon problème: Je veux accéder au contenu de ApplicationRegistrationService par exemple, le nombre d'applications connectées à partir de mon serveur (ConsoleMonitoringServer dans l'exemple). Mais, je ne suis pas sûr de savoir comment y parvenir. Est-ce que je dois créer un canal dans mon serveur au service comme je l'ai fait dans mes clients (ConsoleClient) ou existe-t-il un meilleur moyen d'y parvenir?

code:

Le code est très simplifié dans le but de cette question:

//The callback contract interface 
public interface IApplicationAction 
{ 
    [OperationContract(IsOneWay = true)] 
    void Stop(); 

    [OperationContract(IsOneWay = true)] 
    void Start(); 
} 

[ServiceContract(SessionMode = SessionMode.Required, 
    CallbackContract = typeof(IApplicationAction))] 
public interface IApplicationRegistration 
{ 
    [OperationContract] 
    void Register(Guid guid, string name); 

    [OperationContract] 
    void Unregister(Guid guid); 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, 
    ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class ApplicationRegistrationService : IApplicationRegistration 
{ 
    //IApplicationRegistration Implementation 
} 

public class ApplicationAction : IApplicationAction 
{ 
    //IApplicationAction Implementation 
} 

application Console pour cet exemple

class ConsoleClient 
{ 
    static void Main(string[] args) 
    { 
     ApplicationAction actions = new ApplicationAction(); 

     DuplexChannelFactory<IApplicationRegistration> appRegPipeFactory = 
      new DuplexChannelFactory<IApplicationRegistration>(actions, 
      new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/AppReg")); 

     IApplicationRegistration proxy = appRegPipeFactory.CreateChannel(); 
     proxy.Register(Guid.Empty, "ThisClientName"); 

     //Do stuffs 
    } 
} 

serveur de console pour cette exemple

class ConsoleMonitoringServer 
{ 
    static void Main(string[] args) 
    { 
     using (ServiceHost host = new ServiceHost(typeof(ApplicationRegistrationService), 
      new Uri[]{ new Uri("net.pipe://localhost")})) 
     { 
      host.AddServiceEndpoint(typeof(IApplicationRegistration), 
       new NetNamedPipeBinding(), "AppReg"); 

      host.Open(); 

      //Wait until some write something in the console 
      Console.ReadLine(); 

      host.Close(); 
     } 
    } 
} 

Répondre

9

Enfin, je trouve la réponse et il était assez facile. J'ai juste besoin de créer l'instance de service et passer la référence au constructeur de ServiceHost.

donc je dois remplacer le code suivant:

using (ServiceHost host = new ServiceHost(typeof(ApplicationRegistrationService), 
       new Uri[]{ new Uri("net.pipe://localhost")})) 

par:

ApplicationRegistrationService myService = new ApplicationRegistrationService(); 

using (ServiceHost host = new ServiceHost(myService, 
       new Uri[]{ new Uri("net.pipe://localhost")})) 
0

Si vous voulez dire que vous souhaitez une communication bidirectionnelle entre votre service de surveillance et vos services enregistrés ou noeuds, alors vous devriez probablement utiliser une communication bidirectionnelle dans WCF également connu sous le nom de communication en duplex. Trucs très cool.

http://www.codeproject.com/KB/WCF/WCF_Duplex_UI_Threads.aspx

+0

Merci pour les liens, mais je fais déjà une chose semblable dans mon code. –

Questions connexes