2009-10-08 19 views
10

Potrzebuję wykonać raportowanie w czasie rzeczywistym na temat funkcjonalności usługi WCF. Usługa jest hostowana w aplikacji Windows, a moim wymaganiem jest zgłaszanie "na żywo" do aplikacji hosta, gdy klient wywoła określone metody.Subskrybuj zdarzenia w ramach usługi WCF

Moja pierwsza myśl na temat zadania polegała na opublikowaniu zdarzenia "NotifyNow" w kodzie serwisowym i zasubskrybowaniu wydarzenia w mojej aplikacji do rozmów, ale nie wydaje się to możliwe. W moim kodu serwisowego (realizacja, a nie interfejsu) Próbowałem dodanie następującego

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

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

i wywołać metodę SendMessage ilekroć muszę zawiadomić aplikację hosta jakiegoś działania. (Jest to oparte na tym, co pamiętam z tego rodzaju komunikacji międzyformowej w aplikacji WinForm, a moja pamięć mogła mnie tu zawiodła ...)

Kiedy próbuję podłączyć obsługę zdarzeń w moim hoście jednak, że nie może wydawać się aby dowiedzieć się, jak dołączyć do wydarzeń ... Mój kod jest gospodarzem (w pigułce)

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

(zawinięte w try/catch).

Czy ktoś może pomóc, mówiąc mi, jak uzyskać takie podejście do pracy lub wskazując mnie w lepszy sposób.

TIA

Odpowiedz

11

Dziś rano zrobiłem więcej badań i znalazłem o wiele prostsze rozwiązanie, niż zostało to już opisane. Głównym źródłem informacji było this page, ale zostało to podsumowane tutaj.

1) w klasie usług, dodaj następujący (lub podobny) kod ..

public static event EventHandler<CustomEventArgs> CustomEvent; 

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

Ważne jest, aby nieco zdarzenie statyczny, w przeciwnym razie nie będziesz miał szansę na złapanie go.

2) Zdefiniuj klasę CustomEventArgs, na przykład ...

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

3) Dodaj kod w każdej metody usługi, w którym jesteś zainteresowany wywołaniem ...

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

4) Wykonaj instancję ServiceHost jak zwykle i dołącz do zdarzenia.

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

5) Zajmij się komunikatami o zdarzeniach, które pojawią się w hoście.

+0

CustomEvent nie pojawia się dla mnie w Service1. Czy to działa z WCF 4.5? –

1

Wydaje się, że instancji klasy domyślne ServiceHost:

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

i bardzo wątpliwości, że mają "outputMessage" nieruchomości do obsługi zdarzeń.

Nie powinieneś uruchamianiu własnego szereg niestandardowych usług, coś takiego:

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

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

??

Marc

+0

To wygląda na dobre rozwiązanie, ale muszę przyznać, że tak naprawdę nie wiem, jak bym to zrobił ... Jestem z tobą aż do ... twoich niestandardowych rzeczy tutaj ... :(I podejrzewam, że problem, z jakim się borykam, nadal jest związany z głównym kodem obsługi zdarzeń w serwisie – ZombieSheep

+0

Po powrocie do domu i wyłączeniu mojego myślenia na chwilę, widzę dokładnie to, co mówisz - patrzę na ServiceHost, a nie instancja usługi ... Muszę spojrzeć na to jeszcze raz jutro i dowiedzieć się, co muszę kodować w niestandardowym ServiceHost, aby przekazać zdarzenie. Dzięki – ZombieSheep

11

Zmienna usługa jest instancją ServiceHost nie implementacja usługi. Wypróbuj coś takiego:

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

Przepisano, mimo że nie poszedłem tą drogą - Miałem pewne problemy po południu, co oznaczało, że nie mogłem poświęcić na to wymaganego czasu :) – ZombieSheep

+0

Pracowałem jak amulet – Eric

Powiązane problemy