2

ホスト/プラグイン システムの IPC メカニズムとして使用する WCF を学習しようとしています。ホストはプラグインを呼び出して開始/停止できる必要があり、プラグインはサーバーを呼び出してロギングを実行する必要があります。

net.pipe://localhost/SampleServerホストが次の ServiceContract でエンドポイントを作成する簡単なテスト ケースを作成しました。

[ServiceContract]
public interface IWcfServer
{
    [OperationContract]
    void Log(string message);
}

そしてプラグインはnet.pipe://localhost/SampleClient、次の ServiceContract でエンドポイントを作成します。

[ServiceContract]
public interface IWcfClient
{
    [OperationContract]
    string Init();
}

各エンドポイントの設定方法のサンプルを次に示します。

this.server = new ServiceHost(this);
this.server.AddServiceEndpoint(typeof(IWcfServer), 
                               new NetNamedPipeBinding(), 
                               "net.pipe://localhost/SampleServer");
this.server.Open();

そして、これが私がどのように呼び出しを行っているかのサンプルです:

ChannelFactory<IWcfClient> factory = new ChannelFactory<IWcfClient>(
                            new NetNamedPipeBinding(),
                            new EndpointAddress("net.pipe://localhost/SampleClient"));
IWcfClient client = factory.CreateChannel();
using ((IClientChannel)client)
{
    client.Init());
}

ホストは を呼び出すことがplugin.Init()でき、プラグインはhost.Log(message)問題なく呼び出すことができることを確認済みです。ただし、次のシナリオが発生した場合:

  1. ホスト呼び出し plugin.Init()
  2. plugin.Init() の実行中に、プラグインは host.Log(message) を呼び出そうとします。

アプリケーションがフリーズし、TimeoutException1 分後にエラーが発生します。誰が私が間違っているのかについて何か考えがありますか?

4

4 に答える 4

3

サービス ホストの InstanceContextMode は何ですか? シングルトンの場合、Init() が戻るまでブロックされ、循環依存が発生します。

于 2010-10-20T19:33:18.250 に答える
0

WCF の E2E トレースを有効にして、タイムアウトの原因を正確に確認します。- http://msdn.microsoft.com/en-us/library/ms733025.aspx . initがログを必要とする可能性があり、logが最初にinitを実行する必要があるなどの理由で、メソッドがデッドロックを引き起こしている可能性があります。

于 2010-10-10T06:03:16.823 に答える
0

1 分が標準の wcf タイムアウトです。

循環参照はありますか?

また、リッスンしている client.init を呼び出すと、なぜ 2 つのコントラクトがあるのですか?

于 2010-10-09T08:51:33.493 に答える
0

"net.pipe://localhost/SampleServer" "net.pipe://localhost/SampleClient" サーバー用とクライアント用に 2 つの異なる URL があります。問題です!

于 2010-12-22T05:21:02.413 に答える