2009-10-08 6 views
10

J'ai besoin de faire des rapports en temps réel sur la fonctionnalité d'un service WCF. Le service est auto-hébergé dans une application Windows, et mon exigence est de signaler "en direct" à l'application hôte lorsque certaines méthodes sont appelées par le client. Ma première pensée sur la tâche était de publier un événement "NotifyNow" dans le code de service, et de m'abonner à l'événement dans mon app appelant, mais cela ne semble pas être possible. Au sein de mon code de service (mise en œuvre, et non pas l'interface) J'ai essayé d'ajouter les éléments suivantsAbonnement aux événements au sein d'un service WCF

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

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

et appeler la méthode SendMessage chaque fois que je dois informer l'application hôte d'une action. (Ceci est basé sur ce que je me souviens de ce type de communication inter-forme dans une application WinForms, et ma mémoire peut m'avoir laissé ici ...)

Lorsque j'essaie de connecter le gestionnaire d'événements dans mon hôte , bien que, je ne peux pas à comprendre comment attacher aux événements ... Mon code d'hébergement est (en résumé)

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

(enveloppées dans un try/catch).

Quelqu'un peut-il m'aider, soit en me disant comment faire fonctionner cette approche ou en me montrant mieux.

TIA

Répondre

11

J'ai fait d'autres recherches ce matin, et j'ai trouvé une solution beaucoup plus simple que celle qui a déjà été décrite. La principale source d'information était this page, mais elle est résumée ici.

1) dans la classe de service, ajoutez les éléments suivants (ou similaire) code ..

public static event EventHandler<CustomEventArgs> CustomEvent; 

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

Le bit important est de rendre l'événement statique, sinon vous aurez aucune chance de l'attraper.

2) Définir une classe CustomEventArgs, par exemple ...

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

3) Ajouter code d'appel dans chaque méthode du service dans lequel vous avez un intérêt ...

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

4) Instanciez le ServiceHost comme d'habitude, et accrochez-vous à l'événement.

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

5) Gérez les messages d'événement qui surgissent de l'hôte.

+0

CustomEvent ne s'affiche pas sous Service1 pour moi. Est-ce que cela fonctionne avec WCF 4.5? –

1

Vous semblez être instanciation d'une classe par défaut ServiceHost:

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

et je doute fortement que serait une propriété « outputMessage » pour un gestionnaire d'événements.

ne devriez-vous être instancié avec votre hôte de service personnalisé, quelque chose comme ceci:

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

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

??

Marc

+0

Cela ressemble à une bonne solution, mais je dois avouer ne pas savoir vraiment comment je vais y aller ... Je suis avec vous tout le chemin jusqu'à ... vos trucs personnalisés ici ... :(I soupçonne que le problème auquel je vais faire face est toujours lié au code de gestion des événements principaux du service – ZombieSheep

+0

Après être rentré chez moi et avoir perdu la tête pendant un moment, je vois exactement ce que vous dites - je regarde le ServiceHost, pas l'instance du service ... J'ai besoin de regarder à nouveau demain et de trouver ce que j'ai besoin de coder dans le ServiceHost personnalisé pour passer l'événement à travers Merci – ZombieSheep

11

La variable de service est une instance de ServiceHost pas votre mise en œuvre de services. Essayez quelque chose comme:

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

Upvoted, bien que je ne suis pas allé dans cette voie - J'ai eu quelques problèmes cet après-midi qui signifiait que je ne pouvais pas passer le temps nécessaire. :) – ZombieSheep

+0

A travaillé comme un charme – Eric