2

シーンを設定します。

一連の WCF サービス ホスト(S1、S2...Sn)があり、チェーンで動作して受信したメッセージを処理します。最初のサービスが何らかの処理を行い、メッセージを次のサービスに渡します。次のサービスはさらに処理を行います。の上。最終的な WCF サービス(U)は、Sn の出力を受け取り、それを検証します。

サービスS1、S2、...Snは、サービスUとは別に .exe ファイルを介して開始されます。サービスUは、Visual Studio 2010 の単体テストから開始され、開始されるとメッセージが処理のためにサービス s1 に送信されます。私たちが見ている問題は、サービスSnが検証のためにメッセージをサービス U に渡そうとすると、エラーが表示されることです。

http://localhost:9005/ValidationService.svcでリッスンしているエンドポイントがありませんでした

奇妙なことに、このエラーは単体テストの最初の実行時にのみ発生します。最初の失敗の後にテストを再実行すると、テストは問題なくパスします ( SnはメッセージをUに正常に渡します)。ただし、サービスS1、S2、...Sn を閉じて単体テストを再起動して再実行すると、テストの最初の実行時に「no endpoint listens...」が再度スローされます。

私の考えでは、サービスUは、サービスSnがメッセージを送信しようとしている間、まだ開始プロセスを完了している可能性がありますが、私には確信がありません. S1に?

サービスUは、次のコードによって開始されます。

    public void TestChain()
    {
        var binding = new BasicHttpBinding();

        // Construct service U
        var serviceHostU = new ServiceHost(typeof(ChainContract), "http://localhost:9005");
        serviceHostU.AddServiceEndpoint(typeof(ChainContractImplementation), binding, "ValidationService.svc");
        serviceHostU.Open();

        //fire message into service s1
        var ep = new EndpointAddress("http://localhost:8777/InputService.svc");
        var inputFactory = new ChannelFactory<ChainContract>(binding, ep);
        var channel = inputFactory.CreateChannel();
        //fire a message into service s1.
        channel.ReceiveMessage(new TestMessage());

        serviceHostU.Close();
        }

どんな助けでも大歓迎です。

4

1 に答える 1

0

2番目の ServiceHost が呼び出しを行っている間に最初の ServiceHost が初期化されているというあなたの仮定はおそらく正しいと思います。

これを処理するには、デリゲートを ServiceHost の Opened イベントにフックし、そこから 2 番目のサービスを実行します。

于 2012-05-08T13:22:39.363 に答える