Modelo de objetos de Detección de WCF
Detección de WCF consta de un conjunto de tipos que proporcionan un modelo de programación unificado que le permite escribir servicios reconocibles durante el tiempo de ejecución y clientes que encuentran y utilizan estos servicios.
Hacer que un servicio sea reconocible y buscar servicios
Para hacer que un servicio de WCF sea reconocible, agregue ServiceDiscoveryBehavior a ServiceDescription del host de servicio y agregue un extremo de detección. Si un servicio se configura para enviar mensajes de anuncio (agregando una clase AnnouncementEndpoint), se envía el anuncio cuando el host de servicio se abre y se cierra.
Un cliente que desea realizar escuchas de mensajes de anuncio del servicio hospeda un servicio de anuncio y agrega uno o más extremos de anuncio. El servicio de anuncio recibe mensajes de anuncio y genera eventos de anuncio.
El cliente utiliza la clase DiscoveryClient para buscar servicios disponibles. La aplicación cliente crea instancias de la clase DiscoveryClient, pasando un extremo de detección que especifica dónde se deben enviar los mensajes de detección. El cliente llama al método Find, que envía una solicitud Probe. Los servicios que realizan escuchas de los mensajes de detección reciben esta solicitud Probe. Si el servicio coincide con los criterios especificados en Probe, devuelve un mensaje ProbeMatch al cliente.
Modelo de objetos
La API de Detección de WCF define las clases siguientes:
AnnouncementEndpoint
DiscoveryClient
ServiceDiscoveryBehavior
AnnouncementClient
La clase AnnouncementClient proporciona métodos sincrónicos y asincrónicos para enviar los mensajes de anuncio. Hay dos tipos de mensajes de anuncio: Hola y Adiós. Un mensaje Hola se envía para indicar que un servicio se ha vuelto disponible y un mensaje Adiós se envía para indicar que un servicio existente se ha vuelto no disponible. El desarrollador crea una instancia AnnouncementClient, pasando una instancia de AnnouncementEndpoint como un parámetro de constructor.
AnnouncementEndpoint
AnnouncementEndpoint representa un extremo estándar con un contrato de anuncio fijo. Lo utiliza un servicio o cliente para enviar y recibir mensajes de anuncio. De forma predeterminada, la clase AnnouncementEndpoint se establece para utilizar la versión de protocolo 11 de WS_Discovery.
AnnouncementService
AnnouncementService es una implementación proporcionada por el sistema de un servicio de anuncio que recibe y procesa mensajes de anuncio. Cuando se recibe un mensaje de Hola o Adiós, la instancia AnnouncementService llama a OnBeginOnlineAnnouncement del método virtual correspondiente o a OnBeginOfflineAnnouncement, que genera eventos de anuncio.
DiscoveryClient
Una aplicación cliente utiliza la clase DiscoveryClient para buscar y resolver los servicios disponibles. Proporciona métodos sincrónicos y asincrónicos para buscar y resolver servicios basados respectivamente en las clases FindCriteria y ResolveCriteria especificadas. El desarrollador crea una instancia de DiscoveryClient y ofrece una instancia de DiscoveryEndpoint como parámetro de constructor.
Para buscar un servicio, el desarrollador invoca el método Find sincrónico o asincrónico, que proporciona una instancia FindCriteria que contiene el criterio de búsqueda que se debe usar. DiscoveryClient crea un mensaje Probe con los encabezados adecuados y envía la solicitud de búsqueda. Dado que puede haber más de una solicitud Find pendiente en cualquier momento, el cliente pone en correlación las respuestas recibidas y valida la respuesta. A continuación, entrega los resultados al autor de llamada de la operación Find mediante FindResponse.
Para resolver un servicio conocido, el desarrollador invoca el método Resolve sincrónico o asincrónico que proporciona una instancia de ResolveCriteria que contiene EndpointAddress del servicio conocido. DiscoveryClient crea el mensaje Resolve con los encabezados adecuados y envía la solicitud de resolución. La respuesta recibida se pone en correlación con las solicitudes de resolución pendientes y el resultado se entrega al autor de llamada de la operación Resolve mediante ResolveResponse.
Si un proxy de detección está presente en la red y DiscoveryClient envía la solicitud de detección en modo de multidifusión, el proxy de detección puede responder con el mensaje Hola de supresión de multidifusión. DiscoveryClient genera el evento ProxyAvailable cuando recibe los mensajes de Hola en respuesta a solicitudes Find o Resolve pendientes. El evento ProxyAvailable contiene la clase EndpointDiscoveryMetadata sobre el proxy de detección. El empleo de esta información para cambiar del modo ad hoc al modo administrativo depende del desarrollador.
DiscoveryEndpoint
DiscoveryEndpoint representa un extremo estándar con un contrato de detección. Lo emplea un servicio o cliente para enviar o recibir mensajes de detección. De forma predeterminada, DiscoveryEndpoint se establece para utilizar el modo Managed y la versión WSDiscovery11 de WS-Discovery.
DiscoveryMessageSequenceGenerator
DiscoveryMessageSequenceGenerator se utiliza para generar DiscoveryMessageSequence cuando el servicio envía mensajes de detección o de anuncio.
DiscoveryService
La clase abstracta DiscoveryService proporciona un marco para recibir y procesar mensajes Probe y Resolve. Cuando se recibe un mensaje Probe, DiscoveryService crea una instancia de FindRequestContext basada en el mensaje entrante e invoca el método virtual OnBeginFind. Cuando se recibe un mensaje Resolve, DiscoveryService invoca el método virtual OnBeginResolve. Puede heredar de esta clase para proporcionar una implementación personalizada del servicio de detección.
DiscoveryProxy
La clase abstracta DiscoveryProxy proporciona un marco de trabajo para recibir y procesar mensajes de detección y de anuncio. Hereda de esta clase cuando implementa un proxy de detección personalizado. Cuando un mensaje Probe se recibe en multidifusión, la clase DiscoveryProxy llama al método virtual BeginShouldRedirectFind para determinar si se debe enviar un mensaje de supresión de multidifusión. Si el desarrollador decide no enviar un mensaje de supresión de multidifusión o si el mensaje Probe se ha recibido en unidifusión, crea una instancia de la clase FindRequestContext basada en el mensaje entrante e invoca el método virtual OnBeginFind. Cuando un mensaje Resolve se recibe en multidifusión, la clase DiscoveryProxy llama al método virtual ShouldRedirectResolve para determinar si se debe enviar un mensaje de supresión de multidifusión. Si el desarrollador decide no enviar un mensaje de supresión de multidifusión o si el mensaje Resolve se ha recibido en unidifusión, crea una instancia de la clase ResolveCriteria basada en el mensaje entrante e invoca el método virtual OnBeginResolve. Cuando se recibe un mensaje de Hola o Adiós, la clase DiscoveryProxy llama al método virtual apropiado (OnBeginOnlineAnnouncement o OnBeingOfflineAnnouncement), que genera eventos de anuncio.
DiscoveryVersion
La clase DiscoveryVersion representa la versión del protocolo de detección que se debe utilizar.
EndpointDiscoveryBehavior
La clase EndpointDiscoveryBehavior se usa para controlar la detectabilidad de un extremo, especificar las extensiones, los nombres del tipo de contrato adicionales y los ámbitos asociados a dicho extremo. Este comportamiento se agrega a un extremo de la aplicación para configurar su EndpointDiscoveryMetadata. Cuando ServiceDiscoveryBehavior se agrega al host de servicio, todos los extremos de la aplicación hospedados por el host del servicio se vuelven reconocibles de forma predeterminada. El desarrollador puede desactivar la detección para un extremo concreto estableciendo la propiedad Enable en false.
EndpointDiscoveryMetadata
La clase EndpointDiscoveryMetadata proporciona una representación independiente de la versión de un extremo publicado por el servicio. Contiene las direcciones de los extremos, los URI de escucha, los nombres del tipo de contrato, los ámbitos, la versión de metadatos y las extensiones especificados por el desarrollador del servicio. La clase FindCriteria enviada por el cliente durante una operación Probe se compara con EndpointDiscoveryMetadata. Si los criterios coinciden, EndpointDiscoveryMetadata se devuelve al cliente. La dirección del extremo en ResolveCriteria se compara con la dirección del extremo de EndpointDiscoveryMetadata. Si los criterios coinciden, EndpointDiscoveryMetadata se devuelve al cliente.
FindCriteria
La clase FindCriteria es una clase independiente de la versión usada para especificar los criterios usados al buscar un servicio. Admite totalmente los criterios definidos por WS-Discovery para servicios coincidentes. También tiene extensiones que pueden usar los desarrolladores para especificar valores personalizados que se pueden usar durante el proceso de coincidencia. El desarrollador puede proporcionar los criterios de finalización para la operación Find especificando MaxResult, que especifica el número total de servicios que busca el desarrollador o que indica Duration, que es el valor que determina cuánto tiempo espera el cliente para obtener respuestas.
FindRequestContext
Se crean instancias de la clase FindRequestContext mediante el servicio de detección en función del mensaje Probe que recibe cuando un cliente inicia una operación Find. Contiene una instancia de FindCriteria especificada por el cliente.
FindResponse
La clase FindResponse se devuelve al realizador de la llamada de Find con las respuestas de la operación Find. También se encuentra en FindCompletedEventArgs. Contiene una recopilación de EndpointDiscoveryMetadata, que es la recopilación de extremos detectados y un diccionario de EndpointDiscoveryMetadata y DiscoveryMessageSequence.
ResolveCriteria
La clase ResolveCriteria es una clase independiente de la versión usada para especificar los criterios empleados al resolver un servicio conocido. Contiene la dirección del extremo del servicio conocido. El desarrollador puede proporcionar los criterios de finalización para la operación de resolución especificando Duration, que especifica cuánto tiempo espera el cliente para recibir respuestas.
ResolveResponse
La clase ResolveResponse se devuelve al realizador de la llamada del método Resolve con la respuesta de la operación Resolve. También se encuentra en ResolveCompletedEventArgs. Contiene una instancia de EndpointDiscoveryMetadata, que son los extremos detectados y una instancia de DiscoveryMessageSequence.
ServiceDiscoveryBehavior
La clase ServiceDiscoveryBehavior permite al desarrollador agregar la característica de detección a un servicio. Agregue este comportamiento a ServiceHost. La clase ServiceDiscoveryBehavior itera en los extremos de la aplicación agregados al host de servicio y crea una recopilación de EndpointDiscoveryMetadata de los extremos reconocibles. Todos los extremos son reconocibles de forma predeterminada. La detectabilidad de un extremo determinado se puede controlar agregando EndpointDiscoveryBehavior a ese extremo del particular. Si los extremos de anuncio se agregan a ServiceDiscoveryBehavior, el anuncio de todos los extremos reconocibles se envía a cada uno de los extremos de anuncio cuando el host de servicio se abre o se cierra.
ServiceDiscoveryExtension
La clase ServiceDiscoveryExtension se crea mediante la clase ServiceDiscoveryBehavior. Los extremos que se hacen reconocibles se pueden obtener de ServiceDiscoveryExtension. Esta clase también se utiliza para especificar una implementación del servicio de detección personalizada.
UdpAnnouncementEndpoint
La clase UdpAnnouncementEndpoint es un extremo de anuncio estándar que se pre-configura para el anuncio en un enlace de multidifusión de UDP. De forma predeterminada, UdpAnnouncementEndpoint se establece para utilizar la versión WSApril2005 de WS_Discovery.
UdpDiscoveryEndpoint
La clase UdpDiscoveryEndpoint es un extremo de detección estándar que se pre-configura para la detección en un enlace de multidifusión de UDP. De forma predeterminada, DiscoveryEndpoint se establece para usar la versión WSDiscovery11 de WS-Discovery y el modo Adhoc.