【发布时间】:2014-02-24 19:02:14
【问题描述】:
我正在尝试使用 WCF 的 DiscoveryClient 使用此代码进行 Web 服务发现:
// Setup the discovery client (WSDiscovery April 2005)
DiscoveryEndpoint discoveryEndpoint = new UdpDiscoveryEndpoint(DiscoveryVersion.WSDiscoveryApril2005);
DiscoveryClient discoveryClient = new DiscoveryClient(discoveryEndpoint);
// Setup the wanted device criteria
FindCriteria criteria = new FindCriteria();
criteria.ScopeMatchBy = new Uri("http://schemas.xmlsoap.org/ws/2005/04/discovery/rfc3986");
criteria.Scopes.Add(new Uri("onvif://www.onvif.org/"));
// Go find!
criteria.Duration = TimeSpan.FromMilliseconds(duration);
discoveryClient.FindAsync(criteria, this);
这在将单个 IP 地址 (10.1.4.25) 分配给单个网络接口的机器上非常有效。广播从 10.1.4.25 发送到 239.255.255.250,我收到了来自同一子网的 5 台设备的响应。
但是,当机器在同一个接口上有多个 IP 时,它似乎会选择一个源 IP 并从中发送请求。 在这种情况下,我收到了来自单个设备的回复,给出了 169.254 地址。
我尝试将 UdpDiscoveryEndpoint.TransportSettings.MulticastInterfaceId 设置为合适的接口 ID,但它没有帮助,因为它识别了单个接口,而不是特定的 IP。
UdpDiscoveryEndpoint.ListenUri 属性还返回多播地址,因此不会影响源 IP。
UdpDiscoveryEndpoint.Address 是发现协议的 URN。
有什么方法可以强制它从特定 IP 地址发送,或者理想情况下,每个配置的 IP 上的多个请求?
我也试过ONVIF Device Manager 似乎有同样的问题。
请注意,这不是让服务绑定到特定的或“所有地址”IP。它与发送发现请求的 IP 有关。
【问题讨论】:
-
This page 提到设置
/s:Envelope/s:Header/a:ReplyTo地址,但我不确定这可以在 WCF 中设置。 -
你解决过这个问题吗?我也遇到了同样的问题
-
@HypeZ 不,这仍然是个问题。
-
嘿,你们有谁设法找到解决这个问题的方法吗?我几乎在做同样的事情并得到相同的结果。当我有 2 个 IP 地址时,我返回的列表从 30 个奇数设备下降到 5 个。我检查了回复字段,它被正确设置为匿名。我也使用过 Wireshark,并且可以看到我的 NIC 正在接收与一个 IP 相同的所有回复。很奇怪!很抱歉问了和以前一样的问题:-)
-
好的,谢谢您的回复。如果我找到解决方案,我一定会在这里发布,以便我们都能受益
标签: c# web-services wcf networking ws-discovery