2009-07-07 19 views
6

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

Respuesta

9

Finalmente, encontramos la respuesta y fue bastante fácil. Solo necesito crear la instancia de servicio y pasar la referencia al constructor de ServiceHost.

por eso es necesario para reemplazar el código siguiente:

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

por:

ApplicationRegistrationService myService = new ApplicationRegistrationService(); 

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

Si se refiere desea la comunicación bidireccional entre el servicio de vigilancia y sus servicios registrados o nodos, entonces es probable que debe utilizar una comunicación bidireccional en WCF también conocida como comunicación dúplex. Cosas muy interesantes

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

+0

Gracias por los enlaces, pero ya lo hago una cosa similar en mi código. –

Cuestiones relacionadas