Contexto:WCF: Acceso a la instancia de servicio desde el servidor
Necesito desarrollar un servidor de monitoreo que monitorea algunas de nuestras aplicaciones (estas aplicaciones están en C#). Así que decidí desarrollar el sistema con WCF que parece adecuado para mis necesidades.
Estas aplicaciones deben registrarse en el servidor de supervisión cuando comienzan. Después de eso, el servidor de supervisión puede llamar a los métodos Iniciar o Detener de estas aplicaciones.
Todo se ejecuta por completo en la misma máquina, no es necesario ejecutar nada de forma remota.
Así que desarrollé un buen prototipo y todo funciona bien. Cada aplicación se registra en el servidor de supervisión.
Pregunta:
ApplicationRegistrationService
(ver el código de abajo) es la implementación del servicio de vigilancia y es una instancia singleton debido al atributo ServiceBehavior
.
Aquí mi problema: quiero acceder al contenido de ApplicationRegistrationService
por ejemplo, el número de aplicaciones conectadas desde mi servidor (ConsoleMonitoringServer
en el ejemplo). Pero, no estoy seguro de cómo lograr esto.
¿Necesito crear un canal en mi servidor para el servicio como lo hice en mis clientes (ConsoleClient
) o existe una mejor manera de lograr esto?
Código:
El código es muy simplificado para el propósito de esta pregunta:
//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
}
aplicación de consola para este ejemplo
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
}
}
servidor de la consola para este ejemplo
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();
}
}
}
Gracias por los enlaces, pero ya lo hago una cosa similar en mi código. –