WCF サービスをホストしているプロセスから、WCF サービスのクライアントになることはできますか? 同じプロセス内で別のアプリ ドメインを作成しようとしましたが、まだ成功しません。サービスは、Http、Net.TCP、および Net.Pipe で利用できることが確認されています。
助けてくれてありがとう!
ナット
WCF サービスをホストしているプロセスから、WCF サービスのクライアントになることはできますか? 同じプロセス内で別のアプリ ドメインを作成しようとしましたが、まだ成功しません。サービスは、Http、Net.TCP、および Net.Pipe で利用できることが確認されています。
助けてくれてありがとう!
ナット
ServiceModelEx の InProcFactory を使用している場合でも、同じ問題が発生しました。
hereで説明されているように、 ServiceBehavior をnot に設定する必要があることがわかりましたUseSynchronizationContext
。
[ServiceBehavior(UseSynchronizationContext = false)]
public class MyService : IMyService {}
WCF サービスのインプロセス クライアントを作成するプロセスを簡素化する IDesign の ServiceModelEx アセンブリを使用してみてください。
アセンブリには、Net.Pipe エンドポイントとサービスのプロキシを動的に作成する InProcFactory クラスが含まれています。
はい。WCF サービスをホストした後、別のスレッドでホストされたサービスのメソッドを呼び出す必要があります。
あなたの特定の問題が何であるかはわかりませんが、同じプロセス内で WCF サービスを使用する際にも問題がありました。私の問題は、クライアントからサービスを呼び出すと、アプリケーションが 1 分間ハングし、最後にタイムアウト例外が返されることでした。これは、サーバーからの応答を待っている間にスレッドで呼び出しがブロックされたことと関係があると思います...これは、サーバーがブロックされている場合に問題になります。私は名前付きパイプを使用していましたが、他のオプションは試していません。
上記のサムソンの提案はおそらく機能しますが、私は別の方法でそれを行いました。スレッドでホストされたサービスを呼び出す代わりに、スレッドを介してサービスとリスナーを作成しました。これはうまく機能しているようです。
さて、少し話題から外れて、Firestrand は、自分のアプリケーション内からこれを行う理由を尋ねました。Windows サービスと、それが通信する必要がある別の WPF アプリケーション UI を作成しています。ただし、Windows サービスのデバッグはちょっと面倒なので、WCF 呼び出しを含むサービス作業の多くは別の DLL に入ります。この DLL は、「テスト」モードで UI アプリケーションで参照できます。基本的には、スタートアップ ルーチンを呼び出すだけです。実際の Windows サービスがそうするでしょう。これにより、プロセスにアタッチしたり、複数のプロセスを実行したりすることなく、UI と「シミュレートされた」サービスの両方をデバッグできます。うまく機能しているようです。UI と DLL が完成したら、基本的に DLL の単なるラッパーである実際の Windows サービスを作成します。少なくともUIでテストモードを非表示にします。他の誰かがこのアプローチが役立つかもしれないと思った場合に備えて、共有したいと思いました。