其他网络上的WCF UDP发现

时间:2017-04-14 07:01:11

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

我们公司有两个不同的网络,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在其他网络上发现服务吗?

修改

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

1 个答案:

答案 0 :(得分: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进行任何更改的情况下使用它。