Я пытаюсь выполнить обнаружение веб-сервиса, используя WCF DiscoveryClient
с помощью этого кода:
// 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
на подходящий идентификатор интерфейса, который не помог, поскольку он идентифицирует один интерфейс, а не конкретный IP. Свойство UdpDiscoveryEndpoint.ListenUri
также возвращает многоадресный адрес и поэтому не влияет на IP-адрес источника. UdpDiscoveryEndpoint.Address
— это URN протокола обнаружения.
Есть ли способ заставить его отправлять с определенного IP-адреса или, в идеале, несколько запросов на каждый настроенный IP-адрес?
Я также пробовал использовать Диспетчер устройств ONVIF, у которого та же проблема.
Обратите внимание, что речь не идет о привязке службы к определенному IP-адресу или «всем адресам». Речь идет об IP-адресе, с которого отправляется запрос на обнаружение.
/s:Envelope/s:Header/a:ReplyTo
адресов, но я не уверен, что это можно установить в WCF. - person Deanna   schedule 25.02.2014DiscoveryClient
. - person Deanna   schedule 30.11.2016