我会现场。

我们有一组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会导致在第一次运行测试时再次引发“没有端点侦听...”。

我的想法是,在服务Sn尝试向其发送消息时,服务U可能仍在完成其打开过程,但是我不敢相信,如果是这种情况,我们如何才能确保在发出消息之前确保服务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();
        }


任何帮助将不胜感激。

最佳答案

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

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

关于c# - 第一次执行时找不到WCF端点,第二次找到,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10499267/

10-12 03:55