如问题所述,我需要处理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时,下面的建议答案确实有帮助。
答案 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地址更改时,您可能会遇到麻烦,因此请确保按顺序处理错误,如果第一次尝试失败,请重试。