2009-10-08 12 views
10

Ich muss in Echtzeit über die Funktionalität eines WCF-Dienstes berichten. Der Dienst wird in einer Windows-App selbst gehostet, und meine Anforderung besteht darin, der Host-App "live" zu melden, wenn bestimmte Methoden vom Client aufgerufen werden.Abonnieren von Ereignissen in einem WCF-Dienst

Mein erster Gedanke auf der Aufgabe war es, ein „NotifyNow“ Ereignis in dem Service-Code zu veröffentlichen und zu dem Ereignisse in meiner Berufung App abonnieren, aber dies scheint nicht möglich zu sein. In meinem Service-Code (Implementierung, nicht die Schnittstelle) Ich habe versucht, das Hinzufügen der folgenden

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

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

und rufen Sie die Sendmessage-Methode, wenn ich die Host-Anwendung von einer Aktion benachrichtigen müssen. (Dies basiert auf dem, was ich erinnere mich an diese Art von Inter-Form-Kommunikation in einer Winforms App, und mein Gedächtnis kann mich hier unten lassen ...)

Wenn ich versuche, den Event-Handler in meinem Host anschließen allerdings kann ich nicht scheinen, um herauszufinden, wie auf die Ereignisse ... Mein Hosting-Code ist (in aller Kürze)

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

(eingewickelt in einer try/catch) zu befestigen.

Kann mir jemand helfen, entweder indem er mir sagt, wie ich diesen Ansatz zur Arbeit bringen kann oder indem er mir einen besseren Weg weist.

TIA

Antwort

11

Ich habe heute Morgen mehr Forschung, und ergab eine viel einfachere Lösung, als bereits beschrieben wurde. Die Hauptquelle der Information war this page, aber es wird hier zusammengefasst.

1) in der Serviceklasse, fügen Sie den folgenden (oder ähnlichen) Code ..

public static event EventHandler<CustomEventArgs> CustomEvent; 

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

Das wichtige Bit ist das Ereignis statisch zu machen, sonst haben Sie keine Chance, es zu kontrollieren haben. Definieren

2) eine CustomEventArgs Klasse, zum Beispiel ...

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

3) Fügen Sie in jeder Methode des Dienstes ruft Code, in dem Sie ein Interesse haben ...

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

4) Instantiiere den ServiceHost wie üblich und hake dich in das Event ein.

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

5) Behandeln Sie die Ereignismeldungen, die von dort zum Host gelangen.

+0

CustomEvent erscheint nicht unter Service1 für mich. Funktioniert das mit WCF 4.5? –

1

Sie scheinen eine Standard ServiceHost Klasse zu instantiieren:

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

und ich sehr bezweifeln, dass eine "Output" Eigenschaft für einen Event-Handler würde.

Sollten Sie nicht Ihre eigenen Service-Host werden instanziiert wird, etwa wie folgt:

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

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

??

Marc

+0

Das sieht nach einer guten Lösung aus, aber ich muss gestehen, nicht wirklich zu wissen, wie ich das machen würde ... Ich bin mit dir bis zum ... deinem Brauch hier ... :(Ich Ich vermute, das Problem, dem ich gegenüberstehe, ist immer noch, mich an den Code für die Ereignisbehandlung im Service zu hängen. – ZombieSheep

+0

Nachdem ich nach Hause gekommen bin und mich für eine Weile abgewendet habe, sehe ich genau, was du sagst ServiceHost, nicht die Instanz des Dienstes ... Ich muss es morgen noch einmal anschauen und herausfinden, was ich in dem benutzerdefinierten ServiceHost programmieren muss, um das Ereignis zu übergeben. Danke – ZombieSheep

11

Der Service Variable ist eine Instanz von Servicehost nicht Ihre Service-Implementierung. Versuchen Sie etwas wie:

+0

Upvoted, obwohl ich diesen Weg nicht gegangen bin - Ich hatte heute Nachmittag ein paar Probleme, was bedeutete, dass ich nicht die erforderliche Zeit dafür aufbringen konnte :) – ZombieSheep

+0

Arbeitete wie ein Zauber – Eric

Verwandte Themen