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();
}
}
}
Danke für die Links, aber ich habe schon eine ähnliche Sache in meinem Code. –