我会设置场景。
我们有一组 WCF 服务主机(S1、S2...Sn),它们在链中运行以处理接收到的消息,第一个服务进行一些处理,然后将消息传递给下一个服务进行更多处理,等等上。最终的 WCF 服务(U)接收 Sn 的输出并对其进行验证。
服务S1、S2、...Sn通过独立于服务U的 .exe 文件启动。服务U从 Visual Studio 2010 的单元测试启动,一旦启动,就会向服务 s1 发送一条消息进行处理。我们看到的问题是,一旦服务Sn尝试将消息传递给服务 U 进行验证,我们就会遇到错误:
奇怪的是这个错误只发生在第一次运行单元测试时。如果我们在初始失败后重新运行测试,测试将毫无问题地通过(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();
}
任何帮助将不胜感激。