Abonnez-vous à des événements au sein d'un service WCF
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 rapport "vivre" à 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 "NotifyNow" de l'événement dans le code de service, et de vous inscrire à l'événement dans mon application appelante, mais cela ne semble pas être possible. Dans mon code de service (mise en œuvre, et non pas l'interface) j'ai essayé d'ajouter le suivant
public delegate void MessageEventHandler(string message);
public event MessageEventHandler outputMessage;
void SendMessage(string message)
{
if (null != outputMessage)
{
outputMessage(message);
}
}
et d'appeler la méthode SendMessage chaque fois que j'ai besoin de signaler à l'hôte application de certaines mesures. (Ceci est basé sur ce que je retiens de ce type d'inter-forme de communication dans une application winforms, et ma mémoire peut me laisser ici-bas...)
Quand j'ai essayer de brancher le gestionnaire d'événement dans mon hôte, cependant, je n'arrive pas à comprendre comment attacher les événements... Mon code d'hébergement est (en un mot)
service = new ServiceHost(typeof(MyService));
service.outputMessage += new MyService.MessageEventHandler(frm2_outputMessage);
//the above line does not work!
service.Open();
(enveloppé dans un try/catch).
N'importe qui peut aider, en me disant comment faire pour obtenir cette approche du travail ou de me pointer à une meilleure façon.
TIA
OriginalL'auteur ZombieSheep | 2009-10-08
Vous devez vous connecter pour publier un commentaire.
Le service de la variable est une instance de ServiceHost pas l'implémentation du service. Essayez quelque chose comme:
A fonctionné comme un charme
OriginalL'auteur Maurice
J'ai fait un peu plus de recherche, ce matin, et s'est avéré une solution beaucoup plus simple que ce qui a été déjà décrites. La principale source d'information a été cette page, mais elle est résumée ici.
1) dans la classe de service, ajoutez le code suivant (ou similaire) code..
L'important est de faire de l'événement statique, sinon vous n'aurez aucune chance de l'attraper.
2) Définir un CustomEventArgs classe, par exemple...
3) Ajouter le code appelant, dans chaque méthode du service dans lequel vous avez un intérêt...
4) Instancier la ServiceHost que la normale, et le crochet à l'événement.
5) Gérer les messages d'événement que la bulle jusqu'à l'accueil à partir de là.
OriginalL'auteur ZombieSheep
Vous semblez être l'instanciation d'un défaut
ServiceHost
classe:et je doute fort que ce serait un "outputMessage" bien pour un gestionnaire d'événement.
Ne devriez-vous pas être l'instanciation de votre propre service d'accueil, quelque chose comme ceci:
??
Marc
Après rentrer à la maison et en tournant mon esprit pendant un certain temps, je vois exactement ce que vous dites, je suis à la recherche à la ServiceHost, pas l'instance du service... j'ai besoin de le regarder à nouveau demain et comprendre ce que j'ai besoin de code dans la coutume ServiceHost pour transmettre l'événement à travers. Merci
OriginalL'auteur marc_s