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

标签 c# wcf

我来布置场景。

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

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

There was no endpoint listening at http://localhost:9005/ValidationService.svc

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

我的想法是服务 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();
        }

如有任何帮助,我们将不胜感激。

最佳答案

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

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

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

相关文章:

c# - IIS APPPOOL\MyAppPool 无法登录到我的 SQL Server 数据库

c# - 在 WCF 中找不到引用契约(Contract)的默认端点元素

c# - 包含 Namespace.ClassName.<MethodName>b__f 的堆栈跟踪是什么意思?

c# - 仍然对 C# 中与 GetAwaiter 和 GetResult 一起使用的 ConfigureAwait(false) 感到困惑。遇到死锁或方法不返回

c# - Mono的BackgroundWorker在后台不工作?

c# - 如何防止 WCF 客户端应用程序中的 BufferManager/PooledBufferManager 浪费内存?

c# - WCF Web API 和 ASP.NET Web API 有什么区别

WCF:如何通过 IP:Port 连接到服务

c# - 将图像从 PCL 加载到 XAML 中

c# - 从宏调用 Excel VBA 加载项