17 votes

Envoi de messages au processus hôte WCF

J'ai une application Console qui héberge un service WCF. J'aimerais pouvoir déclencher un événement à partir d'une méthode du service WCF et gérer l'événement dans le processus d'hébergement du service WCF. Est-ce possible ? Comment faire ? Puis-je dériver une classe personnalisée de ServiceHost ?

15voto

Franci Penov Points 45358

Il n'est pas nécessaire d'hériter de ServiceHost . Il existe d'autres approches pour résoudre votre problème.

Vous pouvez transmettre une instance de la classe de service, au lieu d'un type à ServiceHost . Ainsi, vous pouvez créer l'instance avant de lancer l'application ServiceHost et ajoutez vos propres gestionnaires d'événements à tous les événements qu'il expose.

Voici un exemple de code :

MyService svc = new MyService();
svc.SomeEvent += new MyEventDelegate(this.OnSomeEvent);
ServiceHost host = new ServiceHost(svc);
host.Open();

L'utilisation de cette approche comporte certaines mises en garde, qui sont décrites dans le document suivant http://msdn.microsoft.com/en-us/library/ms585487.aspx

Vous pouvez aussi avoir une classe singleton bien connue, que vos instances de service connaissent et qui appelle explicitement ses méthodes lorsque des événements se produisent.

0voto

Pankaj Awasthi Points 37
using ...
using ...

namespace MyWCFNamespace
{
    class Program {

        static void Main(string[] args){
            //instantiate the event receiver
            Consumer c = new Consumer();

            // instantiate the event source
            WCFService svc = new WCFService();
            svc.WCFEvent += new SomeEventHandler(c.ProcessTheRaisedEvent);

            using(ServiceHost host = new ServiceHost(svc))
            {
                host.Open();
                Console.Readline();
            }
        }
    }

    public class Consumer()
    {
        public void ProcessTheRaisedEvent(object sender, MyEventArgs e)
        {
            Console.WriteLine(e.From.toString() + "\t" + e.To.ToString());
        }
    }
}

namespace MyWCFNamespace
{
    public delegate void SomeEventHandler(object sender,MyEventArgs e)

    [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
    public class WCFService : IWCFService 
    {
        public event SomeEventHandler WCFEvent;

        public void someMethod(Message message)
        {
            MyEventArgs e = new MyEventArgs(message);
            OnWCFEvent(e);
        }

        public void OnWCFEvent(MyEventArgs e)
        {
            SomeEventHandler handler = WCFEvent;
            if(handler!=null)
            {
                handler(this,e);
            }
        }

    // to do 
    // Implement WCFInterface methods here
    }

    public class MyEventArgs:EventArgs
    {
        private Message _message;
        public MyEventArgs(Message message) 
        {
            this._message=message;
        }
    }
    public class Message
    {
        string _from;
        string _to;
        public string From {get{return _from;} set {_from=value;}}
        public string To {get{return _to;} set {_to=value;}}
        public Message(){}
        public Message(string from,string to)
        this._from=from;
        this._to=to;
    }
}

Vous pouvez définir votre service WCF avec InstanceContextMode = InstanceContextMode.Single .

TestService svc = new TestService();
svc.SomeEvent += new MyEventHandler(receivingObject.OnSomeEvent);
ServiceHost host = new ServiceHost(svc);
host.Open();

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] // so that a single service instance is created
    public class TestService : ITestService
    {
        public event MyEventHandler SomeEvent;
        ...
        ...
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X