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

时间:2019-04-28 08:22:15

标签: c# wcf

如问题所述,我需要处理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
    添加baseAddress =“ http:// ????????:6090 /”
    baseAddresses
    主持人

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

1 个答案:

答案 0 :(得分:-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地址更改时,您可能会遇到麻烦,因此请确保按顺序处理错误,如果第一次尝试失败,请重试。