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();
}
}
}
Merci pour les liens, mais je fais déjà une chose semblable dans mon code. –