2009-07-07 81 views
6

語境:WCF:從服務器訪問服務實例

我需要開發一些監控我們的應用程序的監控服務器(這些應用程序在C#)。所以我決定用WCF開發這個系統,這看起來適合我的需要。

這些應用程序在啓動時必須註冊到監視服務器。之後,監控服務器可以調用這些應用程序的啓動或停止方法。

一切都完全在同一臺機器上執行,沒有什麼需要遠程執行。

所以我開發了一個很好的原型,一切正常。每個應用程序都將自己註冊到監控服務器

問:

ApplicationRegistrationService(見下面的代碼)是監控服務的實現,它是一個單獨的實例由於ServiceBehavior屬性。

這裏我的問題:我想訪問每個例子的ApplicationRegistrationService的內容,從我的服務器連接的應用程序的數量(例如ConsoleMonitoringServer)。但是,我不知道如何實現這一點。

是否需要在我的服務器中創建一個像我在客戶端(ConsoleClient)那樣的服務的通道,或者存在更好的方法來實現此目的?

代碼:

該代碼是非常簡化爲這個問題的目的:

//The callback contract interface 
public interface IApplicationAction 
{ 
    [OperationContract(IsOneWay = true)] 
    void Stop(); 

    [OperationContract(IsOneWay = true)] 
    void Start(); 
} 

[ServiceContract(SessionMode = SessionMode.Required, 
    CallbackContract = typeof(IApplicationAction))] 
public interface IApplicationRegistration 
{ 
    [OperationContract] 
    void Register(Guid guid, string name); 

    [OperationContract] 
    void Unregister(Guid guid); 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, 
    ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class ApplicationRegistrationService : IApplicationRegistration 
{ 
    //IApplicationRegistration Implementation 
} 

public class ApplicationAction : IApplicationAction 
{ 
    //IApplicationAction Implementation 
} 

對於這個例子

class ConsoleClient 
{ 
    static void Main(string[] args) 
    { 
     ApplicationAction actions = new ApplicationAction(); 

     DuplexChannelFactory<IApplicationRegistration> appRegPipeFactory = 
      new DuplexChannelFactory<IApplicationRegistration>(actions, 
      new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/AppReg")); 

     IApplicationRegistration proxy = appRegPipeFactory.CreateChannel(); 
     proxy.Register(Guid.Empty, "ThisClientName"); 

     //Do stuffs 
    } 
} 

控制檯服務器該控制檯應用程序示例

class ConsoleMonitoringServer 
{ 
    static void Main(string[] args) 
    { 
     using (ServiceHost host = new ServiceHost(typeof(ApplicationRegistrationService), 
      new Uri[]{ new Uri("net.pipe://localhost")})) 
     { 
      host.AddServiceEndpoint(typeof(IApplicationRegistration), 
       new NetNamedPipeBinding(), "AppReg"); 

      host.Open(); 

      //Wait until some write something in the console 
      Console.ReadLine(); 

      host.Close(); 
     } 
    } 
} 

回答

9

最後,我找到了答案,這是很容易的。我只需要創建服務實例並將引用傳遞給ServiceHost的構造函數。

所以我需要將以下代碼:

using (ServiceHost host = new ServiceHost(typeof(ApplicationRegistrationService), 
       new Uri[]{ new Uri("net.pipe://localhost")})) 

由:

ApplicationRegistrationService myService = new ApplicationRegistrationService(); 

using (ServiceHost host = new ServiceHost(myService, 
       new Uri[]{ new Uri("net.pipe://localhost")})) 
0

如果你的意思是你想你的監控服務,並已註冊的服務或節點之間的雙向溝通​​,那麼你可能需要使用WCF雙向通信也被稱爲全雙工通信。非常酷的東西。

http://www.codeproject.com/KB/WCF/WCF_Duplex_UI_Threads.aspx

+0

感謝您的鏈接,但我已經在我的代碼做類似的事情。 – 2009-07-08 03:07:53