1

私はWCFにかなり慣れていないので、はっきりと尋ねていない場合はご容赦ください。

LAN 内に接続されたコンピューターのグループ (10 から 20) がある環境があります。各コンピューターには静的 IP があり、AppA と AppB の 2 つのアプリケーションが付属しています。

AppA と AppB は相互に情報を共有するように設計されていますが、同じコンピューター上で AppA と AppB をペアにする必要はありません。LAN 内のコンピューターのリストから 1 台のコンピューターを選択し、選択したコンピューターで実行されている AppB への接続を確立しようとする AppA が必要です。

たとえば、コンピューター X で AppA を実行していて、コンピューターの一覧からコンピューター Y に接続することを選択したとします。AppA は、コンピューター Y (二重 WCF サービスをホストしている) で実行されている AppB に接続します。

私の AppB では、サービスとコールバック インターフェイスを既に定義しています。

ここでいくつか質問があります。

  1. IP が実行中のマシンに依存するように AppB を設定するにはどうすればよいですか? 毎回差分ホスト ベース アドレスを示す異なる App.config ファイルを使用して AppB を 10 ~ 20 回ビルドすることはできません。
  2. 別の IP アドレスで実行されている別の AppB に動的に接続できるように AppA を設定するにはどうすればよいですか? IP の静的リスト (コンピューター リストは静的 IP で静的であるため) が表示され、ユーザーがリストから 1 台のコンピューターを選択する GUI を作成するつもりです。次に、コードを使用して、アプリケーションは を使用して二重チャネルを開きDuplexChannelFactory、 をEndpoint選択したコンピュータのエンドポイントに設定します。

アップデート

Tom Redfern の回答を試してみたところ、AppB でサービスを実行でき、AppA はサービスに接続できました。

ただし、コードを介して実行時にサービスが開始されるように実装しました(セルフホスト)。AppA (クライアント) もDuplexChannelFactory、コードを介して を使用して、実行時にサービスに接続します。これは、AppA と AppB の両方に WCF コンテンツがまったくないことを意味しますApp.config

これは、AppB でサービスをホストする方法です。

public static void HostService()
{
    var baseAddress = new Uri(GetHostAddress());

    Host = new ServiceHost(typeof(MyService), baseAddress);

    NetTcpBinding netTCPBinding = new NetTcpBinding();
    netTCPBinding.ReliableSession.Ordered = true;

    Host.AddServiceEndpoint(typeof(IMyService), netTCPBinding, baseAddress);
    Host.Open();
}

このHostService()メソッドは、ユーザーが AppB で特定のアクションを実行したときにのみ呼び出されます。ただし、アプリケーションを起動すると、WcfSvcHostウィンドウには のインスタンスがあることが示されますがMyService、停止状態です。エラーの詳細には、次のように記載されています。

サービスを開始できません。このサービスにはエンドポイントが定義されていません。構成ファイルにサービスのエンドポイントを少なくとも 1 つ追加してから、再試行してください。

HostService()を呼び出している行にブレークポイントを設定し、 をWcfSvcHost呼び出す前に既にそのメッセージを表示していますHostService()。私が書いたコード以外に、何かがサービスを開始しようとしているようです。

4

1 に答える 1