2

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

编辑

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

4

1 回答 1

1

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

你有两个选择:

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