2009-10-08 89 views
10

我需要做一些關於WCF服務功能的實時報告。該服務是在Windows應用程序中自行託管的,並且我的要求是在客戶端調用某些方法時向主機應用程序報告「實時」。訂閱WCF服務中的事件

我最初的想法是在服務代碼中發佈「NotifyNow」事件,並在我的調用應用程序中訂閱事件,但這似乎不可能。在我的服務代碼(實現,而不是接口),我曾嘗試加入以下

public delegate void MessageEventHandler(string message); 
public event MessageEventHandler outputMessage; 

void SendMessage(string message) 
{ 
    if (null != outputMessage) 
    { 
     outputMessage(message); 
    } 
} 

,並調用SendMessage函數方法,每當我需要通知一些動作的主機應用程序。 (這是基於我在WinForms應用程序中記錄的這種形式間通信,而我的記憶可能讓我失望......)

當我嘗試在我的主機中掛接事件處理程序時不過,我似乎無法弄清楚如何連接到事件......我的託管代碼是(簡而言之)

service = new ServiceHost(typeof(MyService)); 
service.outputMessage += new MyService.MessageEventHandler(frm2_outputMessage); 
    // the above line does not work! 
service.Open(); 

(包裹在一個try/catch)。

任何人都可以幫忙,告訴我如何讓這種方法起作用,或者指點我一個更好的方法。

TIA

回答

11

我今天早上做了一些更多的研究,發現了一個比已經概述的更簡單的解決方案。信息的主要來源是this page,但總結在這裏。

1)在服務類,添加以下(或類似)代碼..

public static event EventHandler<CustomEventArgs> CustomEvent; 

public void SendData(int value) 
{  
    if (CustomEvent != null) 
     CustomEvent(null, new CustomEventArgs()); 
} 

最重要的一點是使事件靜態的,否則你就沒有抓住它的機會。

2)定義CustomEventArgs類,例如...

public class CustomEventArgs : EventArgs 
{ 
    public string Message; 
    public string CallingMethod;       
} 

3)添加調用中,你有興趣在服務的每個方法的代碼...

public string MyServiceMethod() 
{ 
    SendData(6); 
} 

4)將ServiceHost實例化爲正常,並掛入事件中。

ServiceHost host = new ServiceHost(typeof(Service1)); 
Service1.CustomEvent += new EventHandler<CustomEventArgs>(Service1_CustomEvent); 
host.Open(); 

5)手柄的事件消息冒泡從那裏主機。

+0

CustomEvent不會顯示在Service1下。這是否適用於WCF 4.5? – 2013-05-09 19:22:29

1

你似乎實例化一個默認ServiceHost類:

service = new ServiceHost(typeof(MyService)); 
       *********** 
service.outputMessage += new MyService.MessageEventHandler(frm2_outputMessage); 
    // the above line does not work! 

我強烈懷疑這將有一個事件處理程序「outputMessage」屬性。

你不應該被實例化自己的自定義服務主機,這樣的事情:

class MyCustomServiceHost : ServiceHost 
{ 
    ...... your custom stuff here ...... 
} 

service = new MyCustomServiceHost(typeof(MyService)); 
       ******************* 
service.outputMessage += new MyService.MessageEventHandler(frm2_outputMessage); 

Marc

+0

這看起來像一個很好的解決方案,但我不得不承認我不知道我會如何去做......我一直和你在一起......直到你在這裏定製的東西...... :(我懷疑我將要面對的問題仍然圍繞在服務 – ZombieSheep 2009-10-08 12:19:11

+0

中的主要事件處理代碼中。回到家後,我的思緒停止了一段時間,我清楚地知道你在說什麼 - 我在看ServiceHost,而不是服務的實例......我需要再看看它,明白我需要在自定義ServiceHost中編碼來傳遞事件通過。謝謝 – ZombieSheep 2009-10-08 19:43:28

11

服務變量是ServiceHost的一個實例,而不是您的服務實現。嘗試像這樣:

MyService myService = new MyService(); 
myService.outputMessage += new MyService.MessageEventHandler(frm2_outputMessage); 
host = new ServiceHost(myService); 
+0

Upvoted,雖然我沒有沿着這條路線走下去 - 我今天下午遇到了一些問題,這意味着我無法在其上花費所需的時間。:) – ZombieSheep 2009-10-08 19:44:12

+0

像魅力一樣工作 – Eric 2012-07-11 14:25:34