どのように私は、クライアントからのチャネルを使用する前に、WCFのホストが使用可能であることを確認することができますか?
-
21-08-2019 - |
質問
私は、スレーブ・プロセスの数を開始し、Windowsサービスを作成しています。これらのスレーブ・プロセスのそれぞれで、私は、マスター・プロセスからのメッセージを名前付きパイプでリッスンを開始します。
私は現在、マスター・プロセスは、スレーブが完全に起動する前に、名前付きパイプを経由してスレーブを呼び出して、名前付きパイプでリッスンを開始する状況があります。
ProcessStartInfo processStartInfo = new ProcessStartInfo("slave");
processStartInfo.Arguments = Address
Process process = new Process();
process.StartInfo = processStartInfo;
process.Start();
base.Endpoint.Binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
base.Endpoint.Address = Address;
base.Channel.RemoteMethod();
私はこれを行う場合は、チャネルがCommunicationState.Faulted
に取得し、チャネル上の任意の後続の呼び出しも同様に失敗ます。
私は、スレーブ・プロセスが待機を開始することをマスターから確認するために何ができますか?またはどのように私は私のリモート呼び出しを再試行するCommunicationState.Faulted
から回復することができますか?
解決
障害状態から回復する唯一の方法は、インスタンスを再構築することにより、WCFクライアントをreiniailizeとOpen()メソッドを呼び出すことである。
一般的に、私はサービスを呼び出す前に、私はいつもStatusプロパティをチェックし、それが開かれていない場合、私は、私は上記のように、それを再初期化してみてください。それが失敗した場合、サーバーに問題があります。 (私の場合は、状態が不活動による障害が発生しますので、初期化が々ussually succedes)
他のヒント
あなたは、ホスト上の「ServiceFaulted」イベントにアタッチすると、エラー処理を実行するためにこれを使用することができます。文書によると、正しいアクションがホストを中止することです。あなたはその後、試してみて、それを再初期化が、システムがダウンしている場合、それは無益の練習かもしれできます。
おそらく、あなたは「セッション」ベースのサービスを実装することができます。だから、クライアントは、WCFのチャネルを開き、セッションを開くための呼び出し(例えば、「オープン」コール)を行います。これはあなたのホストはスレーブが待機していることを知って聞かせています。
あなたは、スレーブへのリモート通信は、それが初期化されたら、それによって作られた「オープン」コールからのコールバックを介して提供されるように、WCFのコールバックメカニズムを調査することをお勧めします。
アレックスDreneaは、新しいインスタンスを作成したいと言って正しいです。私はプロキシを作成するためのWCFでのChannelFactoryクラスを見てみた推薦します。あなたはあなたの奴隷の初期起動時に対処するために、いくつか試してキャッチタイプの行動でこれを使用することができます。あなたはまた、デバッガがそれほど添えない場合も、あなたのスレーブ・プロセスで例外が表示されていないとして、あなたのスレーブ・プロセスの起動コードにSystem.Diagnostics.Debugger.Break()を配置することがあります。
私はあなたが本当にプロセス分離を必要とするか、またはあなたの仕事のために十分で同期とスレッドを使用するかどうかを尋ねることはできますか?