2009-07-07 9 views
6

コンテキスト:私は(これらのアプリケーションは、C#である)私たちのアプリケーションのいくつかを監視する監視サーバを開発する必要がありWCF:サーバーからサービスインスタンスへのアクセス

。そこで、私のニーズに合った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 
    } 
} 

Consoleサーバーのコンソールアプリケーション例

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

おかげで私はすでに自分のコードに同様のことを行います。 –

関連する問題