2012-05-16 38 views
0

我有一個課程引發了一些事件並執行操作。例如服務類別所需的WCF解決方案

class MyService 
{ 
    EventHandler MessageSent; 
    EventHandler StatusReceived; 

    public void StartService(Serviceconfig configObject) 
    { 
     //Intialize serial port with OnSerialPortReceived event handler. 

    } 

    public void GetStatusForMessage(string messageID) 
    { 
    } 

    public void OnSerialPortReceived(string data) 
    { 
     if(data=="123") 
       MessageSent(this,null); 
     if(data=="456") 
       StatusSent(this,null); 
    } 
} 

這是一個控制檯應用程序,它將在系統啓動時啓動。現在,當事件服務觸發某個事件時,我們需要一個監視器應用程序(基本上是一個回叫客戶端),因此我們應該使用WCF。並且監視器應用程序調用服務類。在上面例如GetStatusForMessage方法將由監視器應用程序調用。那麼現在我們怎樣才能實現使用WCF。如果將上述類作爲服務合同的服務,它將不會被初始化並啓動,直到客戶端發起呼叫。這個類對象將被初始化並在系統重新啓動時啓動它的功能。

我發現這篇文章http://msdn.microsoft.com/en-us/magazine/cc163537.aspx。通過這種方法,我的服務將成爲發佈者客戶端和監視器應用程序將成爲訂戶客戶端應用程序但客戶端必須打電話給服務類。所以我的客戶端應用程序應該支持這兩個回調,並且它應該能夠調用服務方法。我怎樣才能實現這個使用WCF?請注意,監視事件的服務類是單個實例,並在應用程序啓動時進行初始化。

希望我會得到解決方案。請讓我知道更多的澄清。

回答

0

不要試圖讓你的服務classa WCF服務。讓它成爲一個單身人士,讓WCF與之交談。

如果您想讓事件觸發監控應用程序的「事件」,您將需要使用雙工綁定(如果在同一臺計算機上使用跨機器或NetNamedPipeBinding,我會推薦使用NetTcpBinding)。當監控應用程序連接時,保存其回叫通道,並在連接到回叫通道上的事件回調方法中。

注意,你將不得不保持會話的活動在兩側,監控應用程序和服務將不得不更經常地火東西彼此大於配置receiveTimeout(10分鐘默認情況下),但是這可能僅僅是一個「平」的方法來作爲保活

I blogged about duplex communication一段時間,如果有幫助

+0

嗨,我已經看到你的博客,它是一個很好的博客。如果我把它作爲單身人士,當客戶被要求時,會創建對象嗎?但在我的情況下,該對象已經創建。所以我需要創建一個WCF服務,它將與之交談。那麼單身WCF對象應該如何與我已經創建的服務對象進行通信。 –

+0

抱歉 - 不是WCF單身人士,而是設計模式意義上的單身人士 - 您可以通過多種方式開始創建它 - 記住我說過不要讓您的服務成爲WCF服務。實際上,當ServiceHost打開時不是在第一個請求時創建的一個WCF單例 - 但我不會將您的服務類綁定到WCF –

+0

哦!好。即使我也不想將我的WCF服務類綁定到我的服務類。現在我的問題是如何與我的WCF服務類對象和我的服務類進行交互。需要我的服務類的全局對象,以便我可以在WCF單例中訪問它? (我不認爲這是個好主意)。 –

0
  1. 讓你的「serivce」一WIDNOWS服務不是一個控制檯應用程序使用了。
  2. 您可以使您的MyService類成爲WCF服務而不會有任何問題。但是你也可以創建一些其他類來承載你的服務契約,並簡單地與你的Windows服務實現進行通信。
  3. 在Windows服務激活時間和第一個WCF請求(不在IIS中,這是一個自託管的WCF服務,當您想要啓動它時)之間沒有任何關聯。
  4. Here's link to self hosting WCF service tutorial
  5. 使用自動運行選項在您的機器上安裝Windows服務。