Объекты обнаружения 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.
К критериям прекращения относятся следующие.
Duration — максимальное значение времени ожидания ответов от служб в сети. Значение времени ожидания по умолчанию — 20 секунд.
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
Использование клиентского канала обнаружения