其他网络上的 WCF UDP 发现

WCF UDP discovery on other network

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

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

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 网络上有一个客户端 运行ning,它能够在 17 网络上找到服务。

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

编辑

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

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

您有两个选择:

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