处理 WCF 主机中不断变化的 baseAddress

Handling ever changing baseAddress in WCF host

如问题中所述,我需要处理 WCF 服务主机的不断变化的 baseAddress 属性。我有一个包含图片二进制值的简单对象。这将通过服务器上的 Web 应用程序从远程计算机(实际上是许多不同的计算机)发送到服务器,该应用程序请求基于数据库中给定文件的特定文件名。

为此,我制作了服务并实施了必要的合同,但我被困在服务配置文件中的 baseAddress 元素处。

问题是远程机器的 IP 是动态的。它以大约 5 分钟的间隔(外部提供)更改,并且机器不是 VPN 或任何(内部)网络的一部分,并且没有配置 DNS。它只设置了 PC 名称。但是,我能够从 table 中提取此设备的 IP,以向客户端应用程序提供要绑定的 'correct' IP,但我的问题是在主机端。

问题基本上是 - 在这个描述的主机中,我如何指定客户端将绑定到的 baseAddress?我想我无法在每次检测到 IP 地址更改时都重新绑定,或者这不是问题吗?

我试过指定“http://localhost:6090/BasicService/" which was unreachable when I attempted from the client to call "http://192.168.0.4:6090/BasicService/”。但是,当我在客户端和主机中指定确切的 IP 时,客户端成功联系了主机。

注意我的服务绑定的是basicHttpBinding,私网IP地址只是在测试环境下。直播时,这些设备会从 m2m 提供商那里接收 IP。

编辑: 为了更好地理解,远程设备将是服务器并包含 XYZ 的绑定信息,而 XYZ 正是我想要弄清楚的。客户端可以连接到本地机器以检索特定远程设备的 IP,然后将客户端绑定到该给定 IP,但问题是在主机中我不确定在以下内容中使用什么:
主持人
基本地址
添加 baseAddress="http://????????:6090/"
基本地址
主持人

当这些设备处于封闭网络中并且您调用服务器的私有 IP 但不适用于服务器的 public IP 时,下面的建议答案确实有帮助。

你的问题有些混乱(见评论)。在这个答案中,我假设您的客户 知道您服务器的 IP 地址,但您的问题是将服务器绑定到未知的 IP 地址。

服务器端

为了监听服务器端的任何 IP 地址,您可以使用 IP 地址 0.0.0.0。这样在服务器端就不用担心ip地址了。像这样:

<host>
  <baseAddresses>
    <add baseAddress="http://0.0.0.0:6090/BasicService" />
  </baseAddresses>
</host>

客户端

并且在客户端,您可以通过在代码中指定绑定来实现动态绑定:

string ipAddress = GetIpFromTable(); // Assuming client can do this...
string url = $"http://{ipAddress}:6090/BasicService";
var binding = new BasicHttpBinding();
var address = new EndpointAddress(url);        
var client = new BasicServiceClient(binding, address);

您可能 运行 当 IP 地址更改 during/before 请求时遇到一些麻烦,因此请确保您按顺序处理错误并在第一次尝试失败时重试。