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


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

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

DiscoveryClient

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

FindCriteria

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

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

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

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

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

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

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

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

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

    • FindCriteria.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("http://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)

См. также