【发布时间】:2019-04-28 08:22:14
【问题描述】:
如问题中所述,我需要处理 WCF 服务主机的不断变化的 baseAddress 属性。我有一个包含图片二进制值的简单对象。这将通过服务器上的 Web 应用程序从远程计算机(实际上是许多不同的计算机)发送到服务器,该应用程序根据数据库中的给定文件请求特定文件名。
为此,我创建了服务并实施了必要的合同,但我被困在服务配置文件中的 baseAddress 元素上。
难题在于远程机器的 IP 是动态的。它以大约 5 分钟的间隔(由外部提供)更改,并且该机器不是 VPN 或任何(内部)网络的一部分,并且没有配置 DNS。它只设置了它的电脑名称。但是,我可以从表中提取此设备的 IP,以向客户端应用程序提供要绑定的“正确”IP,但我的问题在于主机端。
问题基本上是 - 在这个描述的主机中,我如何指定客户端将绑定到的 baseAddress?我想每次检测到 IP 地址更改时我都无法重新绑定,或者这不会有问题吗?
我尝试指定“http://localhost:6090/BasicService/”,当我尝试从客户端调用“http://192.168.0.4:6090/BasicService/”时无法访问。但是,当我在客户端和主机中指定确切的 IP 时,客户端会成功联系主机。
请注意,我的服务的绑定是 basicHttpBinding 并且私有 IP 地址只是在测试环境中。当这些设备上线时,这些设备会从 m2m 提供商那里获得 IP。
编辑:
为了更好地理解,远程设备将是服务器并包含绑定信息,即 XYZ 和 XYZ 是我想要弄清楚的。客户端可以连接到本地计算机以检索特定远程设备的 IP,然后将客户端绑定到该给定 IP,但问题是在主机中我不确定在以下内容中使用什么:
主持人
基本地址
添加 baseAddress="http://????????:6090/"
基本地址
主持人
当这些设备处于封闭网络中并且您调用服务器的私有 IP 但不适用于服务器的公共 IP 时,以下建议的答案确实会有所帮助。
【问题讨论】:
-
您使用的术语不正确。 “基地址”仅从服务器的角度来看,不是客户端。客户端必须始终指定完整的 URL。 stackoverflow.com/questions/2016285/…
-
如果您不打算使用 DNS,那么您可能需要考虑在动态 IP 上路由到设备的固定 IP。相同的原理用于负载平衡器或从 Internet 隐藏计算机
-
"...当我在...客户端...中指定确切的 IP 时,客户端成功联系了主机" - 你期待什么?如果您在实际主机上运行客户端然后,您可以使用
localhost。但是,在与主机不同的计算机上运行的客户端从不使用localhost。看来您需要了解 IP 解析 -
@MickyD 我知道IP地址解析是如何工作的,问题是反过来理解的。请参阅我在下面的答案中提供的评论。我的意思是,当我在服务器中指定“localhoost”时,我认为这可能意味着该服务将托管在设备的当前 IP 上。
-
请注意,我的回答是您的问题的答案。您的下一个问题应该是关于 IP 解析,而不是关于服务器绑定。