具有动态主机/客户端的WCF双工服务

时间:2016-10-19 03:00:20

标签: .net wcf duplex-channel

我是WCF的新手,所以如果我不是很清楚的话,请耐心等待。

我有一个环境,我在局域网内连接了一组计算机(10到20个)。每台计算机都有一个静态IP,并附带2个应用程序:AppA和AppB。

AppA和AppB旨在相互共享信息,但我不希望AppA在同一台计算机上与AppB配对。我需要AppA从LAN中的计算机列表中选择一台计算机,然后尝试建立与所选计算机上运行的AppB的连接。

例如,我在计算机X上运行AppA,并且从计算机列表中,我选择连接到计算机Y.AppA将连接到在计算机Y上运行的AppB(托管双工WCF服务)

在我的AppB上,我已经定义了服务和回调接口。

我在这里有几个问题:

  1. 如何设置AppB,使其IP依赖于正在运行的计算机?我不能用不同的App.config文件构建AppB 10-20次,每次都说明差异主机基址。
  2. 如何设置AppA以便它可以动态连接到运行在不同IP地址上的不同AppB?我打算创建一个GUI,其中显示静态IP列表(因为计算机列表是静态的,具有静态IP),并且用户将从列表中选择一台计算机。然后,使用代码,应用程序将使用DuplexChannelFactory打开双工通道,并将Endpoint设置为所选计算机的端点。
  3. 更新

    我尝试了Tom Redfern's answer,我可以在AppB上运行该服务,AppA可以连接到该服务。

    但是,我已经实现了它,以便在运行时通过代码(自托管)启动服务。 AppA(客户端)也通过代码使用DuplexChannelFactory在运行时连接到服务。这意味着AppA和AppB在App.config中都没有WCF内容。

    这就是我在AppB上托管服务的方式:

    public static void HostService()
    {
        var baseAddress = new Uri(GetHostAddress());
    
        Host = new ServiceHost(typeof(MyService), baseAddress);
    
        NetTcpBinding netTCPBinding = new NetTcpBinding();
        netTCPBinding.ReliableSession.Ordered = true;
    
        Host.AddServiceEndpoint(typeof(IMyService), netTCPBinding, baseAddress);
        Host.Open();
    }
    

    仅当用户在AppB中执行某些操作时才会调用HostService()方法。但是,当应用程序启动时,WcfSvcHost窗口显示存在MyService的实例,但它处于停止状态。错误细节说明:

      

    无法启动该服务。此服务没有定义端点。   请在配置文件中添加至少一个服务端点   再试一次。

    我在调用HostService()的行上设置了断点,WcfSvcHost在调用HostService()之前已经显示该消息。除了我编写的代码之外,似乎有些东西正在尝试启动服务。

1 个答案:

答案 0 :(得分:1)

  

如何设置AppB,使其IP依赖于它的机器   正在运行?

使用localhost作为所有AppB实例的基地址。

  

如何设置AppA以便它可以动态连接到   不同的AppB在不同的IP地址上运行?

你必须move the client endpoint configuration into code。然后让某种运行时解析器根据某种查找选择合适的服务端点地址。