Поделиться через


Объекты обнаружения Find и FindCriteria

Операция поиска объектов обнаружения инициируется клиентом для обнаружения одной или нескольких служб и является одним из основных действий, выполняемых при обнаружении. При операции поиска выполняется отправка сообщения зонда WS-Discovery по сети. Службы, которые соответствуют указанному критерию, отвечают сообщениями WS-Discovery ProbeMatch. Дополнительные сведения о сообщениях обнаружения см. в разделе Спецификация WS-Discovery.

DiscoveryClient

Класс DiscoveryClient обеспечивает механизм выполнения операции поиска и упрощает выполнение операций клиентов обнаружений. Он содержит метод Find, который выполняет операцию синхронного поиска с блокировкой, и метод FindAsync, который инициирует асинхронную операцию поиска без блокировки. Оба метода используют параметр FindCriteria и передают результаты пользователю с помощью объекта FindResponse.

FindCriteria

Параметр FindCriteria имеет несколько свойств, которые могут быть сгруппированы в критерии поиска (с указанием искомых служб) и критерии прекращения поиска (время выполнения поиска). Параметр FindCriteria может содержать несколько критериев поиска. По умолчанию служба должна соответствовать всем компонентам, в противном случае она не будет считаться службой, которая соответствует критериям. Если необходимо найти службы, которые соответствуют только части критериев, для службы можно реализовать пользовательскую логику поиска или использовать несколько критериев.

К критериям поиска относятся следующие.

  • ContractTypeNames — необязательный. Имя контракта службы, поиск которой выполняется, и критерий, который обычно используется при поиске служб. Если указано несколько имен контрактов, будет получен ответ только от конечных точек службы, соответствующих всем контрактам. Обратите внимание, что в WCF конечная точка поддерживает только один контракт.

  • Scopes — необязательный. Области представляют собой абсолютные идентификаторы URI, которые используются для категоризации отдельных конечных точек служб. Их можно использовать в случаях, когда несколько конечных точек используется для предоставления одного контракта и необходим способ поиска подмножества конечных точек. Если указано более одной области, будет получен ответ только от конечных точек службы, соответствующих всем областям.

  • Параметр ScopeMatchBy указывает алгоритм сопоставления, который используется для сопоставления областей в сообщении зонда с конечной точкой. Существует пять поддерживаемых правил сопоставления областей.

    • ScopeMatchByExact выполняет базовое сравнение строк с учетом регистра.

    • ScopeMatchByPrefix выполняет сопоставление по сегментам, разделенных символом «/». При поиске http://contoso/building1 было выполнено сопоставление со службой с областью http://contoso/building/floor1. Обратите внимание, что не было выполнено сопоставление с http://contoso/building100 из-за несоответствия двух последних сегментов.

    • ScopeMatchByLdap сопоставляет области по сегментам с помощью URL-адреса LDAP.

    • ScopeMatchByUuid выполняет точное сопоставление областей с помощью строки UUID.

    • ScopeMatchByNone выполняет сопоставление только тех служб, которые не указывают области.

    Если правило сопоставления областей не указано, используется ScopeMatchByPrefix.

К критериям прекращения относятся следующие.

  1. Duration — максимальное значение времени ожидания ответов от служб в сети. Значение времени ожидания по умолчанию — 20 секунд.

  2. MaxResults — максимальное количество ожидаемых ответов. Если ответы MaxResults получены до истечения Duration, операция поиска завершается.

FindResponse

FindResponse имеет свойство коллекции Endpoints, в котором содержатся все ответы, отправленные соответствующими службами в сети. Если ни одна служба не отправила ответ, коллекция пустая. Если ответила одна или несколько служб, все ответы сохраняются в объекте EndpointDiscoveryMetadata, в котором содержится адрес, контракт и дополнительные сведения о службе.

В следующем примере описывается выполнение операции поиска в коде.

// Create DiscoveryClient
DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());

// Create FindCriteria
FindCriteria findCriteria = new FindCriteria(typeof(IPrinterService));
findCriteria.Scopes.Add(new Uri("https://www.contoso.com/building1/floor1"));
findCriteria.Duration = TimeSpan.FromSeconds(10); 

// Find ICalculatorService endpoints            
FindResponse findResponse = discoveryClient.Find(findCriteria);

Console.WriteLine("Found {0} ICalculatorService endpoint(s).", findResponse.Endpoints.Count)

См. также

Задачи

Образец обнаружения с помощью областей
Образец асинхронной операции Find
Базовый образец

Основные понятия

Общие сведения об обнаружении WCF
Использование клиентского канала обнаружения