Модель объектов обнаружения WCF

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

Включение возможности обнаружения для службы и обнаружения служб

Чтобы служба WCF была доступной для обнаружения, добавьте поведение ServiceDiscoveryBehavior в описание ServiceDescription узла службы и задайте конечную точку обнаружения. Если служба настроена для отправки сообщений с объявлениями (путем добавления AnnouncementEndpoint), то объявление отправляется при открытии и закрытии узла службы.

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

Клиент пользуется для поиска доступных служб классом DiscoveryClient. Приложение клиента создает класс DiscoveryClient, передавая конечную точку обнаружения, которая указывает, куда следует отправлять сообщения обнаружения. Клиент вызывает метод Find, который отправляет запрос Probe. Службы, следящие за сообщениями обнаружения, получают запрос Probe. Если служба совпадает с критериями, заданными в Probe, то она отправляет сообщение ProbeMatch обратно клиенту.

Объектная модель

API-интерфейс обнаружения WCF определяет следующие классы:

AnnouncementClient

Класс AnnouncementClient предоставляет синхронные и асинхронные методы для отправки сообщений с объявлениями. Существует два типа сообщений с объявлениями ― Hello и Bye. Сообщение Hello указывает, что служба стала доступной, а сообщение Bye ― что существующая служба стала недоступной. Разработчик создает экземпляр AnnouncementClient и передает экземпляр AnnouncementEndpoint конструктору в качестве параметра.

AnnouncementEndpoint

AnnouncementEndpoint представляет стандартную конечную точку с заданным контрактом объявления. Используется службой или клиентом для отправки и получения сообщений с объявлениями. По умолчанию класс AnnouncementEndpoint использует версию протокола WS_Discovery 11.

AnnouncementService

AnnouncementService ― системная реализация службы объявлений, которая получает и обрабатывает сообщения с объявлениями. При получении сообщения Hello или Bye экземпляр AnnouncementService вызывает соответствующий виртуальный метод OnBeginOnlineAnnouncement или OnBeginOfflineAnnouncement, который создает события объявлений.

DiscoveryClient

Класс DiscoveryClient используется клиентским приложением для нахождения и разрешения доступных служб. Он предоставляет синхронные и асинхронные методы для нахождения и разрешения служб на основе заданных критериев FindCriteria и ResolveCriteria соответственно. Разработчик создает экземпляр DiscoveryClient и передает экземпляр DiscoveryEndpoint в качестве параметра конструктора.

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

Чтобы разрешить известную службу, разработчик вызывает синхронный или асинхронный метод Resolve, который представляет экземпляр ResolveCriteria, содержащий адрес EndpointAddress известной службы. Клиент DiscoveryClient создает сообщение Resolve с соответствующими заголовками и отправляет запрос разрешения. Полученный ответ сопоставляется с необработанными запросами разрешения, и результат доставляется объекту, вызвавшему операцию Resolve, при помощи метода ResolveResponse.

Если прокси-сервер обнаружения присутствует в сети и клиент DiscoveryClient отправляет запрос обнаружения по нескольким адресам, то прокси-сервер обнаружения может ответить многоадресным сообщением отмены типа Hello. Клиент DiscoveryClient создает событие ProxyAvailable при получении сообщений Hello в ответ на необработанный запрос Find или Resolve. Событие ProxyAvailable содержит метаданные EndpointDiscoveryMetadata о прокси-сервере обнаружения. Затем разработчик должен использовать эту информацию для переключения из нерегламентированного режима в управляемый.

DiscoveryEndpoint

DiscoveryEndpoint представляет стандартную конечную точку с заданным контрактом обнаружения. Используется службой или клиентом для отправки и получения сообщений обнаружения. По умолчанию конечная точка DiscoveryEndpoint использует режим Managed и версию WSDiscovery11.

DiscoveryMessageSequenceGenerator

DiscoveryMessageSequenceGenerator используется для формирования последовательности сообщений DiscoveryMessageSequence, когда служба отправляет сообщения обнаружения или сообщения с объявлениями.

DiscoveryService

Абстрактный класс DiscoveryService реализует базовые функции для получения и обработки сообщений Probe и Resolve. При получении сообщения Probe служба DiscoveryService создает экземпляр FindRequestContext на основе входящего сообщения и вызывает виртуальный метод OnBeginFind. При получении сообщения Resolve служба DiscoveryService вызывает виртуальный метод OnBeginResolve. Можно наследовать у этого класса для обеспечения реализации пользовательской службы обнаружения.

DiscoveryProxy

Абстрактный класс DiscoveryProxy реализует базовые функции для получения и обработки сообщений обнаружения и сообщений с объявлениями. Этот класс можно наследовать при реализации пользовательского прокси-сервера обнаружения. При получении сообщения Probe через многоадресную рассылку класс DiscoveryProxy вызывает виртуальный метод BeginShouldRedirectFind, чтобы определить, следует ли отправить многоадресное сообщение отмены. Если разработчик решит не отправлять многоадресное сообщение отмены, либо если по адресу одноадресной рассылки получено сообщение Probe, будет создан экземпляр класса FindRequestContext на основе входящего сообщения и вызван виртуальный метод OnBeginFind. При получении сообщения Resolve через многоадресную рассылку класс DiscoveryProxy вызывает виртуальный метод ShouldRedirectResolve, чтобы определить, следует ли отправить многоадресное сообщение отмены. Если разработчик решит не отправлять многоадресное сообщение отмены либо если по адресу одноадресной рассылки получено сообщение Resolve, будет создан экземпляр класса ResolveCriteria на основе входящего сообщения и вызван виртуальный метод OnBeginResolve. При получении сообщения Hello или Bye экземпляр DiscoveryProxy вызывает соответствующий виртуальный метод (OnBeginOnlineAnnouncement или OnBeingOfflineAnnouncement), который создает события объявлений.

DiscoveryVersion

Класс DiscoveryVersion представляет используемую версию протокола обнаружения.

EndpointDiscoveryBehavior

Класс EndpointDiscoveryBehavior используется для управления возможностью обнаружения конечной точки, указания модулей, дополнительных имен типов контракта и областей, связанных с этой конечной точкой. Это поведение добавляется в конечную точку приложения для настройки ее метаданных EndpointDiscoveryMetadata. При добавлении поведения ServiceDiscoveryBehavior к узлу службы все конечные точки приложения, размещенные узлом службы, по умолчанию получают возможность обнаружения. Разработчик может отключить обнаружение для определенной конечной точки, установив свойство Enable в значение false.

EndpointDiscoveryMetadata

Класс EndpointDiscoveryMetadata обеспечивает независимое от версии представление конечной точки, опубликованной службой. Служба содержит адреса конечных точек, URI прослушивания, имена типов контрактов, области, версию метаданных и модули, указанные разработчиком службы. Критерии FindCriteria, отправляемые клиентом в течение операции Probe, сопоставляются с метаданными EndpointDiscoveryMetadata. Если критерии совпадут, метаданные EndpointDiscoveryMetadata будут возвращены клиенту. Адрес конечной точки в ResolveCriteria сопоставляется с адресом конечной точки EndpointDiscoveryMetadata. Если критерии совпадут, метаданные EndpointDiscoveryMetadata будут возвращены клиенту.

FindCriteria

Класс FindCriteria является независимым от версии классом, который используется для указания критериев, используемых при нахождении службы. Класс полностью поддерживает критерии, определенные WS-Discovery, для сопоставления служб. Он также имеет модули, которые разработчики могут использовать для указания пользовательских значений, используемых в течение процесса сопоставления. Разработчик может предоставить критерии завершения для операции Find, указав значение MaxResult, которое задает общее количество служб, разыскиваемых разработчиком, либо задает длительность Duration, то есть время, в течение которого клиент ожидает ответы.

FindRequestContext

Класс FindRequestContext создается службой обнаружения на основе сообщения Probe, полученного при запуске клиентом операции Find. Класс содержит экземпляр FindCriteria, заданный клиентом.

FindResponse

Класс FindResponse возвращается объекту, вызвавшему метод Find, с ответами операции Find. Также присутствует в FindCompletedEventArgs. Содержит коллекцию метаданных EndpointDiscoveryMetadata, которая является коллекцией обнаруженных конечных точек и словарем элементов EndpointDiscoveryMetadata и DiscoveryMessageSequence.

ResolveCriteria

Класс ResolveCriteria является независимым от версии классом, который используется для указания критериев, используемых при разрешении уже известной службы. Содержит адрес конечной точки известной службы. Разработчик может предоставить критерии завершения для операции разрешения путем указания длительности Duration, то есть времени, в течение которого клиент ожидает ответов.

ResolveResponse

Класс ResolveResponse возвращается объекту, вызвавшему метод Resolve, с ответом операции Resolve. Также присутствует в ResolveCompletedEventArgs. Содержит экземпляр метаданных EndpointDiscoveryMetadata, которые являются обнаруженными конечными точками, и экземпляр DiscoveryMessageSequence.

ServiceDiscoveryBehavior

Класс ServiceDiscoveryBehavior позволяет разработчику добавлять функцию обнаружения для службы. Это поведение добавляется к ServiceHost. Класс ServiceDiscoveryBehavior просматривает конечные точки приложения, добавленные к узлу службы, и создает коллекцию EndpointDiscoveryMetadata, содержащую конечные точки, доступные для обнаружения. Все конечные точки по умолчанию доступны для обнаружения. Возможность обнаружения определенной конечной точки может быть ограничена за счет добавления к ней поведения EndpointDiscoveryBehavior. Если конечные точки объявлений добавлены в поведение ServiceDiscoveryBehavior, то объявление всех точек, которые могут быть обнаружены, отправляется для каждой конечной точки объявления при открытии или закрытии узла службы.

ServiceDiscoveryExtension

Класс ServiceDiscoveryExtension создается классом ServiceDiscoveryBehavior. После этого конечные точки, которые теперь могут быть обнаружены, доступны в модуле ServiceDiscoveryExtension. Этот класс также используется для реализации пользовательской службы обнаружения.

UdpAnnouncementEndpoint

Класс UdpAnnouncementEndpoint ― это стандартная точка объявления, которая является предустановленной для объявления через привязку для многоадресной рассылки UDP. По умолчанию класс UdpAnnouncementEndpoint использует версию WSApril2005 WS_Discovery.

UdpDiscoveryEndpoint

Конечная точка UdpDiscoveryEndpoint ― это стандартная конечная точка обнаружения, заранее настроенная для операций обнаружения через привязку для многоадресной рассылки. По умолчанию конечная точка DiscoveryEndpoint использует версию WSDiscovery11 WS-Discovery и режим Adhoc.