私はWCFにかなり慣れていないので、はっきりと尋ねていない場合はご容赦ください。
LAN 内に接続されたコンピューターのグループ (10 から 20) がある環境があります。各コンピューターには静的 IP があり、AppA と AppB の 2 つのアプリケーションが付属しています。
AppA と AppB は相互に情報を共有するように設計されていますが、同じコンピューター上で AppA と AppB をペアにする必要はありません。LAN 内のコンピューターのリストから 1 台のコンピューターを選択し、選択したコンピューターで実行されている AppB への接続を確立しようとする AppA が必要です。
たとえば、コンピューター X で AppA を実行していて、コンピューターの一覧からコンピューター Y に接続することを選択したとします。AppA は、コンピューター Y (二重 WCF サービスをホストしている) で実行されている AppB に接続します。
私の AppB では、サービスとコールバック インターフェイスを既に定義しています。
ここでいくつか質問があります。
- IP が実行中のマシンに依存するように AppB を設定するにはどうすればよいですか? 毎回差分ホスト ベース アドレスを示す異なる App.config ファイルを使用して AppB を 10 ~ 20 回ビルドすることはできません。
- 別の 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()
。私が書いたコード以外に、何かがサービスを開始しようとしているようです。