Бөлісу құралы:


Пользовательские критерии поиска

В примере CustomFindCriteria показано, как создать пользовательский область сопоставления с помощью логики и как реализовать пользовательскую службу обнаружения. Клиенты используют функции сопоставления пользовательских областей, чтобы расширить функции поиска, предоставляемые системой WCF Discovery. В этом образце реализован следующий сценарий.

  1. Клиент ищет службу калькулятора.

  2. Чтобы уточнить поиск, клиент должен использовать правило сопоставления пользовательских областей.

  3. Согласно этому правилу, служба отвечает клиенту, если ее конечная точка совпадает с любой из областей, указанных клиентом.

Что демонстрирует

  • Создание пользовательской службы обнаружения.

  • Реализация сопоставления пользовательских областей по алгоритму.

Обсуждение

Клиент ищет критерии соответствия типа OR. Служба отвечает, если области в ее конечных точках совпадают с любыми из областей, предоставленных клиентом. В этом случае клиент ищет службу калькулятора, любая из областей которой принадлежит следующему списку.

  1. net.tcp://Microsoft.Samples.Discovery/RedmondLocation

  2. net.tcp://Microsoft.Samples.Discovery/SeattleLocation

  3. net.tcp://Microsoft.Samples.Discovery/PortlandLocation

Для этого клиент направляет службы в правило сопоставления пользовательских областей, передавая пользовательскую область по URI. Чтобы упростить сопоставление пользовательских областей, служба должна использовать пользовательскую службу обнаружения, которая поддерживает правило сопоставления пользовательских областей и в которой реализована соответствующая логика сопоставления.

В клиентском проекте откройте файл Program.cs. Заметьте, что в поле ScopeMatchBy объекта FindCriteria задается определенный URI. Этот идентификатор отправляется в службу. Если служба не понимает это правило, он игнорирует запрос на поиск клиента.

Откройте проект службы. Для реализации пользовательской службы обнаружения используются три файла.

  1. AsyncResult.cs. Это реализация, требуемая методами AsyncResult обнаружения.

  2. CustomDiscoveryService.cs. Этот файл реализует пользовательскую службу обнаружения. В реализации расширяется класс DiscoveryService и переопределяются необходимые методы. Обратите внимание на реализацию метода OnBeginFind. Метод проверяет, задано ли клиентом правило сопоставления пользовательских областей. Это тот же пользовательский URI, который клиент указывал ранее. Если задано настраиваемое правило, следует путь кода, реализующий логику сопоставления "OR".

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

  3. CustomDiscoveryExtension.cs. Последний шаг реализации службы обнаружения — подключение этой реализации настраиваемой службы обнаружения к узлу службы. Здесь используется вспомогательный класс CustomDiscoveryExtension. Этот класс расширяет класс DiscoveryServiceExtension. Пользователь должен переопределить метод GetDiscoveryService. В этом случае метод возвращает экземпляр пользовательской службы обнаружения, который был создан ранее. PublishedEndpoints - коллекция ReadOnlyCollection<T>, которая содержит все конечные точки приложения, добавленные в ServiceHost. Пользовательская служба обнаружения использует эту коллекцию для заполнения внутреннего списка. Пользователь может добавлять и другие метаданные конечных точек.

Наконец, откройте файл Program.cs. Заметьте, что в узел добавляются объекты ServiceDiscoveryBehavior и CustomDiscoveryExtension. После этого, когда в узле есть конечная точка, через которую принимаются сообщения обнаружения, приложение может использовать пользовательскую службу обнаружения.

Заметьте, что клиенту удается найти службу, не зная ее адреса.

Настройка, сборка и выполнение образца

  1. Откройте решение, содержащее проект.

  2. Выполните сборку проекта.

  3. Запустите приложение службы.

  4. Выполните клиентское приложение