【问题标题】:WCF Discovery returns hard-coded URLWCF 发现返回硬编码的 URL
【发布时间】:2011-01-18 20:45:50
【问题描述】:

宏伟的设计如下:

  1. 某些应用程序作为 Windows 服务安装
  2. 网络上可能有几个这样的
  3. 它们每个都向网络公开一些接口(将其视为“远程控制”或“配置”——诸如此类)
  4. 然后有另一个应用程序充当该接口的客户端(使用相同的类比 - “遥控器”或“配置工具”)
  5. 后者的目的是在网络上嗅出前者的所有实例,将它们作为列表显示给用户,并允许用户使用暴露的界面(即“远程控制”或“配置”它们)
  6. 为简单起见,我们假设每个人都在同一个网络中 - 也就是说,每个人都可以听到彼此的 UDP 广播。

很简单,嗯?在过去,我曾经使用自己的基于 UDP 广播的发现机制来构建这种东西。

但现在我想我会很酷很时髦,并在 Ad Hoc 模式下使用时髦的 WCF Discovery。它有效!谁能告诉? :-)

但不完全是。 正如我之前提到的herethere,发现从服务的配置中返回了硬编码的 URL。也就是说,如果服务的配置文件中有<baseAddresses><add baseAddress="net.tcp://localhost:1234/My/Service" /></baseAddresses>,那么这正是我将从发现客户端获得的内容——包括“localhost”部分。

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

所以问题是:如何让发现客户端给我可用的 URL,而不是 localhost-ish 垃圾?

为了节省大家的时间,有几个想法是行不通的:

  1. 在部署时更改服务的配置文件,将其编码为真实 IP 地址或机器名称。
    不起作用,因为 IP 和机器名称都可能更改。
  2. 从代码(至少部分)配置服务,使用当前 IP 或机器名称来构造 URL。
    不工作。机器名无用,因为网络中可能没有 dns。 IP 没用,因为计算机可能同时在多个网络上,因此有多个 IP 地址(这不是假设,我们实际上确实有这种情况)。那该用哪一个呢?

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

【问题讨论】:

    标签: c# wcf discovery service-discovery


    【解决方案1】:

    您应该能够通过将localhost 替换为通配符来解决此问题:

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

    【讨论】:

    • 嘿,它有效!我记得尝试过通配符,但可能我用了一些不正确的方式......谢谢!
    • 哦。它说我只能在 15 小时内奖励赏金。如果我忘记了,请提醒我。
    • 注意:如果你使用通配符,我认为你会绑定到多个IP地址(假设你有多个网卡)
    【解决方案2】:

    不要使用配置。

    以编程方式运行服务。

    这是一个以编程方式添加端点的示例:Programmatic_Endpoint_Configuration

    还有这个,为了比较:Self-hosting_and_base_addresses

    【讨论】:

    • 这并不能解决问题。请参阅我的问题中倒数第二段。
    【解决方案3】:

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

    【讨论】:

    • 有很多没有 DNS 的网络。我一直在使用这样的网络。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多