WCF发现返回硬编码的URL

10

这个设计的流程如下:

  1. 安装某些应用程序作为Windows服务。
  2. 网络上可能有多个此类服务。
  3. 每个服务都向网络公开某些接口(可以认为是“远程控制”或“配置”等)。
  4. 然后有另一个应用程序作为该接口的客户端(使用相同的类比,即“远程控制器”或“配置工具”)。
  5. 后者的目标是嗅探网络中所有前者的实例,并将它们显示为用户列表,并允许用户使用该公开接口在不同位置上对其进行操作(即“远程控制”或“配置”它们)。
  6. 为简单起见,假设所有人都在同一网络中,即每个人都可以听到彼此的UDP广播。

很简单吧?在以前的日子里,我经常用自己编写的基于UDP广播的发现机制来构建这种东西。

但现在我想变得酷和时髦,使用高级模式下的 WCF Discovery。它真的有效!谁能想到呢? :-)

但还不完美。正如我之前注意到的 这里那里,发现返回服务配置中硬编码的URL。也就是说,如果服务在其配置文件中有 <baseAddresses><add baseAddress="net.tcp://localhost:1234/My/Service" /></baseAddresses> ,那么我从发现客户端得到的就是它 - 包括“localhost”部分。

不用说,如果我尝试使用该URL调用服务,则结果并不令人兴奋。

问题是:如何让发现服务客户端给我有用的URL,而不是那些本地主机垃圾?

以下是一些行不通的想法:

  1. 在部署时更改服务配置文件,编码其真实IP地址或计算机名称。
    这不起作用,因为IP和计算机名称都可能会更改。
  2. 从代码中配置服务(至少部分地),使用当前IP或计算机名称构建URL。
    这也不起作用。计算机名称无用,因为网络中可能没有DNS。IP无用,因为计算机可能同时连接多个网络,因此具有多个IP地址(这不是假设,我们确实遇到了这种情况)。那么该使用哪一个IP地址呢?

换句话说,我不需要调整服务,而是需要让发现服务客户端给我发现响应来自的地址。

3个回答

13

您可以通过使用通配符替换 localhost 来解决这个问题:

<baseAddresses><add baseAddress="net.tcp://*:1234/My/Service" /></baseAddresses>

嘿,它可以工作了!我记得尝试过通配符,但可能我用的方法不正确...谢谢! - Fyodor Soikin
哦,它说我只能在15小时后才能授予悬赏。如果我忘记了,请提醒我。 - Fyodor Soikin
注意:如果使用通配符(假设您有多个 NIC),则会绑定到多个 IP 地址。 - Jack Ukleja

3

1
这并没有解决问题。请查看我问题中倒数第二段的内容。 - Fyodor Soikin

0

除了通配符之外,另一个选项是使用机器的 DNS 可解析主机名而不是 localhost。


1
有很多网络没有DNS。我经常与这种网络一起工作。 - Fyodor Soikin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接