第一次执行时找不到WCF端点,第二次找到

时间:2012-05-08 13:09:10

标签: c# wcf

我会设置场景。

我们有一组WCF服务主机(S1,S2 ... Sn),它们在链中运行以处理收到的消息,第一个服务进行一些处理,然后将消息发送到下一个服务,它做了一些更多的处理等等。最终的WCF服务(U)接收Sn的输出并验证它。

服务 S1,S2,... Sn 通过.exe文件分别从服务 U 启动。服务 U 从单元测试从Visual Studio 2010启动,一旦启动,就会将消息触发到服务s1进行处理。我们看到的问题是,一旦服务 Sn 尝试将消息传递给服务U进行验证,我们就会出现错误:

  

http://localhost:9005/ValidationService.svc

没有收听端点

奇怪的是这个错误只发生在单元测试的第一次运行中。如果我们在初始失败后重新运行测试,测试将毫无问题地通过( Sn 成功将消息传递给 U )。但是,关闭服务 S1,S2,... Sn 重新启动并重新运行单元测试会导致在第一次运行测试时再次抛出“无端点监听...”。 / p>

我的想法是服务 U 可能仍在完成其开放流程,而服务 Sn 尝试向其发送消息,但是我不相信,如果这是在将消息发送到S1之前,我们如何确保服务U是开放和监听的?

服务 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();
        }

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

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

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