我会现场。
我们有一组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/