处理WCF主机中不断更改的baseAddress

问题描述 投票:0回答:1

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

为此,我已经完成了服务并实现了必要的合同,但我被困在服务配置文件中的baseAddress元素中。

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

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

我试图指定“http://localhost:6090/BasicService/”,当我试图从客户端调用“http://192.168.0.4:6090/BasicService/”时无法访问。但是,当我在客户端和主机中指定确切的IP时,客户端会成功联系主机。

请注意,我的服务绑定是basicHttpBinding,私有IP地址只在测试环境中。在线时,这些设备从m2m提供商处接收IP。

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

以下建议的答案确实有助于这些设备处于封闭网络中并且您调用服务器的专用IP,但不能与服务器的公共IP一起使用。

c# wcf
1个回答
-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.