【问题标题】:WCF UDP discovery on other network其他网络上的 WCF UDP 发现
【发布时间】:2017-04-14 07:01:10
【问题描述】:

我们公司有两个不同的网络,17 和 18

  • 170.17.xxx.xxx
  • 170.18.xxx.xxx

在 17 网络上有一个可发现的 WCF 服务正在运行。 这是由以下代码配置的:

host.AddDefaultEndpoints();
host.AddServiceEndpoint(new UdpDiscoveryEndpoint());

EndpointDiscoveryBehavior behavior = new EndpointDiscoveryBehavior();
behavior.Scopes.Add(scope);

foreach(ServiceEndpoint endpoint in host.Description.Endpoints)
{
    if(endpoint.IsSystemEndpoint || endpoint is DiscoveryEndpoint    || 
       endpoint is AnnouncementEndpoint || endpoint is ServiceMetadataEndpoint)
        continue;

    endpoint.Behaviors.Add(behavior);
}

具有范围的行为被添加到所有非系统端点,并且可以通过在网络上发送 udp 数据包(UdpDiscoveryEndpoint 的默认实例)来发现它。

客户端通过使用默认 UdpDiscoveryEndpoint 构造 DiscoveryClient 来发现服务。

DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());

FindCriteria criteria = new FindCriteria(typeof(T));
criteria.Scopes.Add(scope);

FindResponse discovered = discoveryClient.Find(criteria);
discoveryClient.Close();

当客户端和服务都在同一网络上运行时,这可以正常工作。 但我希望有一个客户端在 18 网络上运行,它能够在 17 网络上找到服务。

那么是否可以使用 DiscoveryClient 和 UdpDiscoveryEndpoint 发现其他网络上的服务?

编辑

或者这可能是防火墙问题?

【问题讨论】:

    标签: c# wcf service-discovery ws-discovery


    【解决方案1】:

    这不是防火墙问题,而是 WS-Discovery 的正常行为。 WS-Discovery 使用 SOAP-over-UDP 发送到多播 IP 组 (239.255.255.250)。并且多播数据包通常不会被路由并停留在本地网络的范围内。因此,DiscoveryClient 无法在没有外部帮助的情况下发现其他网络上的服务。

    你有两个选择:

    1. 将您的路由器配置为在彼此之间传递多播 IP 流量。虽然实现起来相当容易,但它可能会不必要地加载您的网络间链接,并且还可能需要您的 ISP 的帮助,或者您可能需要某种隧道。
    2. 在可发现服务所在的网络上设置所谓的“发现代理”。 Discovery Proxy 基本上在本地执行发现,然后使用 HTTP 将发现结果传递到其他网络。由于 Discovery Proxy 具有相同的 SOAP WSDL,因此现有 WS-Discovery 客户端无需通过 Internet 进行任何更改即可使用它。

    【讨论】:

    • @Vladimir Bashkirtsev,我需要在包含两个子网的小型企业网络上实现 WS-Discovery“发现代理”。经过大量研究,似乎没有我可以购买或下载的“即用型”发现代理。我猜我必须编写自己的发现代理。我不是 .NET 或 C++ 程序员,但我确实有使用 Windows .CMD、VBA 和 PHP 的经验,所以我了解编程。您能否就我应该如何开发 Discovery Proxy 提出建议?
    • @BillVallance 对于初学者,您应该阅读我在stackoverflow.com/questions/29370598/… 的回答。根据您的经验,您可以通过 composer 提取逻辑/ws-discovery(我已经编写了该模块 - ws-discovery 用 PHP 实现),然后您需要通过 HTTP 实现 SOAP 以向外界提供 Discovery Proxy 服务。
    • @Vladimir Bashkirtsev,非常感谢您的链接!我去看看,看看能不能弄明白。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    相关资源
    最近更新 更多