2008-09-26 108 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; 
     ... 
     ... 
    }