Отправка сообщений в хост-процесс WCF - PullRequest
15 голосов
/ 26 сентября 2008

У меня есть консольное приложение, в котором размещается служба WCF. Я хотел бы иметь возможность вызывать событие из метода в службе WCF и обрабатывать событие в процессе размещения службы WCF. Это возможно? Как бы я это сделал? Могу ли я получить собственный класс из ServiceHost?

Ответы [ 2 ]

14 голосов
/ 26 сентября 2008

Вам не нужно наследовать от ServiceHost. Есть и другие подходы к вашей проблеме.

Вы можете передать экземпляр класса обслуживания вместо типа ServiceHost. Таким образом, вы можете создать экземпляр перед запуском ServiceHost и добавить свои собственные обработчики событий для любых событий, которые он предоставляет.

Вот пример кода:

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

Существуют некоторые предостережения при использовании этого подхода, как описано в http://msdn.microsoft.com/en-us/library/ms585487.aspx

Или вы можете иметь хорошо известный одноэлементный класс, о котором ваши экземпляры службы знают и явно вызывают его методы, когда происходят события.

0 голосов
/ 28 ноября 2010
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;
    }
}

Вы можете определить свою службу WCF с помощью 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;
        ...
        ...
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...