2009-07-07 8 views
6

Kontext:WCF: Zugriff auf die Service-Instanz vom Server

Ich brauche einen Überwachungsserver zu entwickeln, die einige unserer Anwendungen (diese Anwendungen in C#) überwacht. Also entschied ich mich, das System mit WCF zu entwickeln, das für meine Bedürfnisse geeignet erscheint.

Diese Anwendungen müssen sich beim Start beim Überwachungsserver registrieren. Danach kann der Überwachungsserver die Methoden Start oder Stop dieser Anwendungen aufrufen.

Alles wird komplett auf der gleichen Maschine ausgeführt, nichts muss remote ausgeführt werden.

Also habe ich einen guten Prototyp entwickelt und alles funktioniert gut. Jede Anwendung registriert sich selbst beim Überwachungsserver.

Frage:

ApplicationRegistrationService (siehe Code unten) ist die Umsetzung des Monitoring-Service und es ist eine Singleton-Instanz aufgrund des ServiceBehavior Attribut.

Hier mein Problem: Ich möchte auf den Inhalt von ApplicationRegistrationService pro Beispiel zugreifen, die Anzahl der verbundenen Anwendungen von meinem Server (im Beispiel ConsoleMonitoringServer). Aber ich bin mir nicht sicher, wie ich das erreichen soll.

Muss ich einen Kanal in meinem Server zum Dienst erstellen, wie ich es in meinen Clients getan habe (ConsoleClient) oder gibt es einen besseren Weg, dies zu erreichen?

Code:

Der Code sehr für die Zwecke dieser Frage wird vereinfacht:

//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 
} 

Konsolenanwendung für dieses Beispiel

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

Console Server für diese Beispiel

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

Antwort

9

Schließlich finde ich die Antwort und es war ziemlich einfach. Ich muss nur die Dienstinstanz erstellen und den Verweis auf den Konstruktor von ServiceHost übergeben.

Also muss ich den folgenden Code ersetzen:

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

von:

ApplicationRegistrationService myService = new ApplicationRegistrationService(); 

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

Wenn Sie meinen, Sie zwei-Wege-Kommunikation zwischen Service und Überwachung Ihrer registrierten Diensten oder Knoten mögen, dann sollten Sie wahrscheinlich zwei-Wege-Kommunikation in WCF auch als Duplex-Kommunikation bekannt werden. Sehr cooles Zeug.

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

+0

Danke für die Links, aber ich habe schon eine ähnliche Sache in meinem Code. –

Verwandte Themen