2011-01-03 17 views
1

私は書類作成中のWindowsサービスを持っています。サービス自体に問題はありませんが、これはクライアントとの特別な通信を必要とする最初のサービスです(ほかのサービスは.configファイルで静的に設定されています)。私はサービスにクライアントの話を持って、それにメッセージを送り、返信を返す必要があります。クライアント/サーバ(サービス)C#Windowsサービス用の通信

私はWCFを最初にフラッシュしましたが、私はWindowsサービスとWCFをどのようにしてと話すかを解決できないようです。。私はWindowsサービスホストにWCFサービスを持たせることができますが、それはインスタンスを取得することと同じではありません。また、実行中のWindowsサービスのインスタンスを取得するWCFサービスを取得する方法が表示されないので、はWindowsサービスと通信できます。

私は何かが不足しているか、私は "ここからそこに着くことができない"と言う人が必要です。それができない場合は、サービスが直接通信を処理している「低レベル」のソケットコールに頼ると思います。私はそれを避けることを望んでいました。事前に

おかげで、
ジム

編集:私はこれについて明確ではなかった申し訳ありません。私はクライアントアプリケーションをWCFと話す方法を理解しています。私はWCFのサービスをWindowsサービスまたはその逆にホスティングする方法を理解しようとしています。これは同じバイナリであり、私はクライアントがサービス(サービスするサービスではなく、クライアントからサービスへ)と話す方法を提供するためにこれを行うことを検討しています。

答えて

3

これは、Windowsサービス内からWCFサービスをホストすることで実現できます。クライアントはWCFサービスにWebサービスコールを行い、WCFサービスは必要に応じてWindowsサービスを呼び出すことができます。

以下の手順では、WCFサービスを別のプロジェクトに保存することを前提としています。これは、両方のコンポーネントをWindowsサービスプロジェクトに保持するよりも少し難しいですが、

  1. 2つのプロジェクト(WcfService1とWindowsService1)から開始します。 Windowsサービスの作業を実行するMyServiceWorkerという名前のクラスを作成します。
  2. WindowsService1の参照をWcfService1に追加します。
  3. WcfService1にIMyServiceWorkerという名前のインターフェイスを定義します。これはワーカークラスの操作を定義し、WindowsService1のMyServiceWorkerで実装する必要があります。
  4. WcfService1.Service1に「public static IMyServiceWorker myServiceWorker」を追加します。
  5. WindowsServiceのOnStart()メソッドで、MyServiceWorkerを作成し、WcfService1.Service1.myServiceWorkerに渡します。
  6. MyServiceWorkerを開いて起動し、WcfServiceを開きます。ここで

WcfServiceためのコードの重要なビットです:

public interface IMyServiceWorker 
    { 
     void ejectCD(); 
     void volumeUp(); 
     void volumeDown(); 
    } 

    public class Service1 : IService1 
    { 
     //this is the reference to your Windows Service. 
     public static IMyServiceWorker WindowsServiceWorker; 

     public void ejectCD() 
     { 
      WindowsServiceWorker.ejectCD(); 
     } 

     public void volumeUp() 
     { 
      WindowsServiceWorker.volumeUp(); 
     } 

     public void volumeDown() 
     { 
      WindowsServiceWorker.volumeDown(); 
     } 
    } 

そして、ここでは、Windowsサービスのためのコードです:

public class MyServiceWorker:IMyServiceWorker 
    { 
     //You will need to implement these methods. 

     public void ejectCD() 
     { 
      throw new NotImplementedException(); 
     } 

     public void volumeUp() 
     { 
      throw new NotImplementedException(); 
     } 

     public void volumeDown() 
     { 
      throw new NotImplementedException(); 
     } 

     internal void Open() 
     { 
      throw new NotImplementedException(); 
     } 
    } 
+0

それは素晴らしい作品。これを手伝ってくれてありがとう。 – Jim

関連する問題