gpt4 book ai didi

c# - 其他网络上的 WCF UDP 发现

转载 作者:太空宇宙 更新时间:2023-11-03 12:29:18 25 4
gpt4 key购买 nike

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

编辑

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

最佳答案

这不是防火墙问题,而是 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 进行任何更改。

关于c# - 其他网络上的 WCF UDP 发现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43406764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com