我会设置场景。
我们有一组WCF服务主机(S1,S2 ... Sn),它们在链中运行以处理收到的消息,第一个服务进行一些处理,然后将消息发送到下一个服务,它做了一些更多的处理等等。最终的WCF服务(U)接收Sn的输出并验证它。
服务 S1,S2,... Sn 通过.exe文件分别从服务 U 启动。服务 U 从单元测试从Visual Studio 2010启动,一旦启动,就会将消息触发到服务s1进行处理。我们看到的问题是,一旦服务 Sn 尝试将消息传递给服务U进行验证,我们就会出现错误:
没有收听端点
奇怪的是这个错误只发生在单元测试的第一次运行中。如果我们在初始失败后重新运行测试,测试将毫无问题地通过( 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();
}
非常感谢任何帮助。
答案 0 :(得分:0)
我认为你假设第一个ServiceHost正在初始化而第二个正在进行调用可能是正确的。
要处理此问题,您可以将委托挂钩到ServiceHost的Opened事件,然后从那里运行第二个服务。