【问题标题】:Handling ever changing baseAddress in WCF host处理 WCF 主机中不断变化的 baseAddress
【发布时间】: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 解析,而不是关于服务器绑定。

标签: c# wcf


【解决方案1】:

您的问题有些混乱(请参阅 cmets)。在这个答案中,我假设您的客户端确实知道您服务器的 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 地址在请求期间/之前发生更改时,您可能会遇到一些麻烦,因此请确保按顺序处理错误并在第一次尝试失败时重试。

【讨论】:

  • 这在时不起作用"...远程机器的IP是动态的。它以大约5分钟的间隔变化..."。问题是客户端需要知道服务器在哪里而不是要监听什么 IP 或基地址
  • @MickyD 客户端通过从表中提取 IP 来知道服务器在哪里。服务器永远无法知道客户端在哪里,除非客户端调用服务器......他只是想将他的服务绑定到服务器端的IP地址,但无法硬编码IP地址,因为它每五分钟更改一次。
  • @MickyD 好吧,让 Joandre 解决这个问题解释上的差异。
  • @MickyD 是正确的。我看到给定的答案有助于客户端而不是服务器端。所以是的,远程设备是托管服务的设备,并且那台电脑的公共 IP 一直在变化。这些 IP 地址被推送到服务器(客户端应用程序 [其他本地计算机] 将能够连接到的本地计算机,以查询在给定时刻绑定到的“正确的主机/wcf 服务主机”IP)。所以主机是远程的,IP地址不断变化,而客户端有能力拉IP。我需要设置主机来处理这些 IP 更改。
  • @JessedeWit 谢谢这个答案有很大帮助,但这是客户端绑定信息而不是主机绑定信息的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2020-11-29
  • 2014-08-07
  • 2018-01-15
  • 1970-01-01
  • 2019-08-29
相关资源
最近更新 更多