2009-10-08 11 views
10

Ho bisogno di fare alcuni rapporti in tempo reale sulla funzionalità di un servizio WCF. Il servizio è auto-ospitato in un'applicazione Windows e il mio requisito è quello di segnalare "live" all'app host quando determinati metodi vengono chiamati dal client.Iscriviti agli eventi all'interno di un servizio WCF

Il mio primo pensiero sull'attività era di pubblicare un evento "NotifyNow" nel codice del servizio e iscrivermi all'evento nella mia app chiamante, ma questo non sembra possibile. All'interno del mio codice di servizio (attuazione, non l'interfaccia) Ho provato ad aggiungere il seguente

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

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

e chiamare il metodo SendMessage ogni volta che ho bisogno di informare l'applicazione miriade di qualche azione. (Questo si basa su quello che ricordo di questo tipo di comunicazione inter-forma in un'app winforms e la mia memoria potrebbe avermi lasciato qui ...)

Quando provo ad agganciare il gestore di eventi nel mio host , però, io non riesco a capire come collegare agli eventi ... il mio codice di hosting è (in poche parole)

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

(avvolto in un try/catch).

Qualcuno può aiutare, sia dicendomi come ottenere questo approccio al lavoro o indicando me in un modo migliore.

TIA

risposta

11

ho fatto qualche ricerca più questa mattina, e alzato una soluzione molto più semplice di quanto è già stato delineato. La principale fonte di informazioni è stata this page, ma è riassunta qui.

1) nella classe di servizio, aggiungere il() codice o simili seguito ..

public static event EventHandler<CustomEventArgs> CustomEvent; 

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

Il bit importante è quello di rendere l'evento statico, altrimenti non avrete possibilità di catturare esso.

2) Definire una classe CustomEventArgs, per esempio ...

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

3) Aggiungere il codice chiamante in ogni metodo del servizio in cui si ha un interesse ...

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

4) Istanzia il ServiceHost come di consueto e connettiti all'evento.

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

5) Gestire i messaggi di evento che arrivano fino all'host da lì.

+0

CustomEvent non viene visualizzato per Service1 per me. Funziona con WCF 4.5? –

1

ti sembra di essere un'istanza di una classe predefinita ServiceHost:

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

e dubito fortemente che avrebbe una proprietà "outputMessage" per un gestore di eventi.

Non dovresti essere istanziare il proprio servizio di accoglienza personalizzato, qualcosa di simile:

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

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

??

Marc

+0

Questa sembra una buona soluzione, ma devo confessare di non sapere davvero come farei a riguardo ... Sono con te fino a ... le tue cose personalizzate qui ... :(I sospetto che il problema che sto per affrontare sia ancora in agguato nel codice di gestione degli eventi principale nel servizio – ZombieSheep

+0

Dopo essere tornato a casa e aver spento la mente per un po ', vedo esattamente quello che stai dicendo - Sto guardando il ServiceHost, non l'istanza del servizio ... Ho bisogno di rivederlo domani e capire cosa ho bisogno di codificare nel ServiceHost personalizzato per passare l'evento. Grazie – ZombieSheep

11

La variabile servizio è un esempio di ServiceHost non l'implementazione del servizio. Provare qualcosa di simile:

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

In suvated, anche se non ho seguito questa rotta - Ho avuto alcuni problemi questo pomeriggio che significava che non potevo passare il tempo richiesto. :) – ZombieSheep

+0

Ha funzionato come un fascino – Eric