2009-10-08 12 views
10

Tengo la necesidad de informar en tiempo real sobre la funcionalidad de un servicio WCF. El servicio se aloja automáticamente en una aplicación de Windows y mi requisito es informar "en vivo" a la aplicación de host cuando el cliente llama a ciertos métodos.Suscribirse a eventos dentro de un servicio WCF

Mi primer pensamiento en la tarea fue publicar un evento "NotifyNow" en el código de servicio, y suscribirme al evento en mi aplicación de llamada, pero esto no parece posible. Dentro de mi código de servicio (aplicación, la interfaz no) He intentado agregar el siguiente

public delegate void MessageEventHandler(string message); 
public event MessageEventHandler outputMessage; 

void SendMessage(string message) 
{ 
    if (null != outputMessage) 
    { 
     outputMessage(message); 
    } 
} 

y llame al método SendMessage cada vez que necesito para notificar a la aplicación de host de alguna acción. (Esto se basa en lo que recuerdo de este tipo de comunicación entre formas en una aplicación de winforms, y mi memoria puede haberme decepcionado ...)

Cuando intento conectar el controlador de eventos en mi host sin embargo, me parece que no puede encontrar la manera de unir a los eventos ... Mi código de alojamiento es (en pocas palabras)

service = new ServiceHost(typeof(MyService)); 
service.outputMessage += new MyService.MessageEventHandler(frm2_outputMessage); 
    // the above line does not work! 
service.Open(); 

(envuelto en un try/catch).

¿Alguien puede ayudarme, ya sea diciéndome cómo hacer que este enfoque funcione o señalando de una mejor manera?

TIA

Respuesta

11

Investigué un poco más esta mañana y encontré una solución mucho más simple de lo que ya se ha indicado. La principal fuente de información fue this page, pero se resume aquí.

1) en la clase de servicio, agregue el código siguiente (o similar) ..

public static event EventHandler<CustomEventArgs> CustomEvent; 

public void SendData(int value) 
{  
    if (CustomEvent != null) 
     CustomEvent(null, new CustomEventArgs()); 
} 

El bit es importante para que el evento estático, de lo contrario tendrá ninguna posibilidad de captura de él.

2) Definir una clase CustomEventArgs, por ejemplo ...

public class CustomEventArgs : EventArgs 
{ 
    public string Message; 
    public string CallingMethod;       
} 

3) Añadir llamar código en cada método del servicio en el que usted tiene un interés ...

public string MyServiceMethod() 
{ 
    SendData(6); 
} 

4) Crea una instancia del ServiceHost como es normal y engancha el evento.

ServiceHost host = new ServiceHost(typeof(Service1)); 
Service1.CustomEvent += new EventHandler<CustomEventArgs>(Service1_CustomEvent); 
host.Open(); 

5) Gestione desde allí los mensajes de evento que aparecen en el host.

+0

CustomEvent no aparece en Service1 para mí. ¿Funciona esto con WCF 4.5? –

1

Usted parece ser una instancia de una clase por defecto ServiceHost:

service = new ServiceHost(typeof(MyService)); 
       *********** 
service.outputMessage += new MyService.MessageEventHandler(frm2_outputMessage); 
    // the above line does not work! 

y me altamente duda de que tendría una propiedad "outputMessage" para un controlador de eventos.

No deberías estar instanciar su propio host de servicio personalizado, algo como esto:

class MyCustomServiceHost : ServiceHost 
{ 
    ...... your custom stuff here ...... 
} 

service = new MyCustomServiceHost(typeof(MyService)); 
       ******************* 
service.outputMessage += new MyService.MessageEventHandler(frm2_outputMessage); 

??

Marc

+0

Esto parece una buena solución, pero tengo que confesar que no sé realmente cómo lo haría ... Estoy contigo hasta que ... tus cosas personalizadas aquí ... :(I sospecho que el problema que voy a enfrentar aún se está conectando con el código de manejo del evento principal en el servicio – ZombieSheep

+0

Después de llegar a casa y distraerme por un tiempo, veo exactamente lo que estás diciendo: estoy mirando el ServiceHost, no la instancia del servicio ... Necesito volver a verlo mañana y averiguar qué necesito para codificar en ServiceHost personalizado para pasar el evento. Gracias – ZombieSheep

11

La variable de servicio es una instancia de ServiceHost no su implementación del servicio. Pruebe algo como:

MyService myService = new MyService(); 
myService.outputMessage += new MyService.MessageEventHandler(frm2_outputMessage); 
host = new ServiceHost(myService); 
+0

Voto ascendente, aunque no bajé por esta ruta - Tuve algunos problemas esta tarde, lo que significaba que no podía dedicarle el tiempo necesario. :) – ZombieSheep

+0

Funcionó como un amuleto – Eric

Cuestiones relacionadas