1

我对 WCF 还很陌生,所以如果我问的不是很清楚,请多多包涵。

我有一个环境,我有一组计算机(10 到 20 台)连接在 LAN 内。每台计算机都有一个静态 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设置为所选计算机的端点。

更新

我尝试了Tom Redfern 的回答,我能够在 AppB 上运行该服务,并且 AppA 能够连接到该服务。

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

这就是我在 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();
}

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

服务无法启动。该服务没有定义端点。请在配置文件中为该服务添加至少一个端点,然后重试。

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

4

1 回答 1

1

如何设置 AppB 使其 IP 取决于它正在运行的机器?

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

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

您必须将客户端端点配置移动到代码中。然后让某种运行时解析器根据某种查找选择适当的服务端点地址。

于 2016-10-19T10:15:04.433 回答