其他网络上的 WCF UDP 发现
WCF UDP discovery on other network
我们公司有两个不同的网络,17 和 18
- 170.17.xxx.xxx
- 170.18.xxx.xxx
在 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 无法在没有外部帮助的情况下发现其他网络上的服务。
您有两个选择:
- 将您的路由器配置为在彼此之间传递多播 IP 流量。虽然实现起来相当容易,但它可能会不必要地加载您的网络 link,并且它还可能需要您的 ISP 的帮助,或者您可能需要某种隧道。
- 在可发现服务所在的网络上设置所谓的 "Discovery Proxy"。 Discovery Proxy 基本上在本地执行发现,然后使用 HTTP 将发现结果传递到其他网络。由于 Discovery Proxy 具有相同的 SOAP WSDL,现有 WS-Discovery 客户端可以使用它而无需通过 Internet 进行任何更改。
我们公司有两个不同的网络,17 和 18
- 170.17.xxx.xxx
- 170.18.xxx.xxx
在 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 无法在没有外部帮助的情况下发现其他网络上的服务。
您有两个选择:
- 将您的路由器配置为在彼此之间传递多播 IP 流量。虽然实现起来相当容易,但它可能会不必要地加载您的网络 link,并且它还可能需要您的 ISP 的帮助,或者您可能需要某种隧道。
- 在可发现服务所在的网络上设置所谓的 "Discovery Proxy"。 Discovery Proxy 基本上在本地执行发现,然后使用 HTTP 将发现结果传递到其他网络。由于 Discovery Proxy 具有相同的 SOAP WSDL,现有 WS-Discovery 客户端可以使用它而无需通过 Internet 进行任何更改。