2008-09-26 68 views
14

我有一个托管WCF服务的控制台应用程序。我希望能够从WCF服务中的方法中触发事件,并在WCF服务的托管过程中处理事件。这可能吗?我将如何做到这一点?我可以从ServiceHost派生自定义类吗?发送消息到WCF主机进程

回答

14

您不需要继承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

不错!这两种方法对我来说都很合理。我觉得自己愚蠢,我没有想到这两者中的任何一个。我想我刚刚被WCF本身的复杂性所蒙蔽,因为它对我来说是新的。 – dotnetengineer 2008-09-26 14:39:55

0
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; 
    } 
} 

您可以InstanceContextMode = InstanceContextMode.Single定义WCF服务。

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; 
     ... 
     ... 
    }