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重新启动并重新运行单元测试会导致在第一次运行测试时再次抛出“没有端点正在侦听...”。

我的想法是,服务U可能仍在完成其打开过程,而服务Sn尝试向它发送消息,但是我不相信,如果是这种情况,我们如何确保服务 U 已打开并在发送消息之前进行侦听进入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

我认为您假设第一个 ServiceHost 正在初始化,而第二个 ServiceHost 进行调用可能是正确的。

要处理此问题,您可以将委托挂接到您的 ServiceHost 的 Opened 事件并从那里运行您的第二个服务。

于 2012-05-08T13:22:39.363 回答