Modèle objet de découverte WCF
La découverte WCF consiste en un jeu de types fournissant un modèle de programmation unifié qui permet de développer des services détectables au moment de l'exécution et des clients qui recherchent et utilisent ces services.
Rendre un service détectable et rechercher des services
Pour rendre un service WCF détectable, ajoutez un objet ServiceDiscoveryBehavior à l'objet ServiceDescription de l'hôte de service et ajoutez un point de terminaison de découverte. Si un service est configuré pour envoyer des messages d'annonce (en ajoutant un objet AnnouncementEndpoint) l'annonce est envoyée lors de l'ouverture et de la fermeture de l'hôte de service.
Un client qui souhaite écouter des messages d'annonce du service héberge un service d'annonce et ajoute un ou plusieurs points de terminaison d'annonce. Le service d'annonce reçoit des messages d'annonce et déclenche des événements d'annonce.
Un client utilise la classe DiscoveryClient pour rechercher des services disponibles. L'application cliente instancie la classe DiscoveryClient, en transmettant un point de terminaison de découverte qui spécifie où envoyer des messages de découverte. Le client appelle la méthode Find, qui envoie une demande Probe
. Les services qui écoutent les messages de découverte reçoivent ces demandes Probe
. Si le service correspond aux critères spécifiés dans le Probe
, il renvoie un message ProbeMatch
au client.
Modèle objet
L'API de découverte WCF définit les classes suivantes :
AnnouncementClient
La classe AnnouncementClient fournit des méthodes synchrones et asynchrones pour l’envoi de messages d’annonce. Il existe deux types de messages d'annonce, Hello et Bye. Un message de type Hello est envoyé pour indiquer qu'un service est devenu disponible et un message de type Bye est envoyé pour indiquer qu'un service existant est devenu indisponible. Le développeur crée une instance AnnouncementClient, en passant une instance de AnnouncementEndpoint comme paramètre de constructeur.
AnnouncementEndpoint
AnnouncementEndpoint représente un point de terminaison standard avec un contrat d'annonce fixe. Il est utilisé par un service ou un client pour envoyer et recevoir des messages d'annonce. Par défaut, la classe AnnouncementEndpoint est définie pour utiliser la version 11 du protocole WS_Discovery.
AnnouncementService
AnnouncementService est une implémentation fournie par le système d'un service d'annonce qui reçoit et traite des messages d'annonce. Lors de la réception d'un message de type Hello ou Bye, l'instance AnnouncementService appelle la méthode virtuelle appropriée OnBeginOnlineAnnouncement ou OnBeginOfflineAnnouncement, qui déclenche des événements d'annonce.
DiscoveryClient
La classe DiscoveryClient est utilisée par une application cliente pour rechercher et résoudre les services disponibles. Elle fournit des méthodes synchrone et asynchrones pour la recherche et la résolution de services, en fonction des objets spécifiés FindCriteria et ResolveCriteria, respectivement. Le développeur crée une instance DiscoveryClient et fournit une instance de DiscoveryEndpoint comme paramètre de constructeur.
Pour rechercher un service, le développeur appelle la méthode Find
synchrone ou asynchrone, qui fournit une instance FindCriteria contenant les critères de recherche à utiliser. L'objet DiscoveryClient crée un message Probe
avec les en-têtes appropriés et envoie la demande de recherche. Comme il peut y avoir plusieurs demandes Find
en attente n'importe quand, le client met en corrélation les réponses reçues et valide la réponse. Puis il remet les résultats à l'appelant de l'opération Find
, à l'aide de FindResponse.
Pour résoudre un service connu, le développeur appelle la méthode Resolve
synchrone ou asynchrone qui fournit une instance de ResolveCriteria contenant l’ EndpointAddress du service connu. L'objet DiscoveryClient crée le message Resolve
avec les en-têtes appropriés et envoie la demande de résolution. La réponse reçue est mise en corrélation par rapport aux demandes de résolution en attente et le résultat est remis à l'appelant de l'opération Resolve
, à l'aide de l'objet ResolveResponse.
Si un proxy de découverte est présent sur le réseau et que le DiscoveryClient envoie la demande de découverte en mode multidiffusion, le proxy de découverte peut répondre par le message de suppression de multidiffusion de type Hello. Le DiscoveryClient déclenche l'événement ProxyAvailable
lorsqu'il reçoit des messages de type Hello en réponse à des demandes Find
ou Resolve
en attente. L'événement ProxyAvailable
contient le EndpointDiscoveryMetadata sur le proxy de découverte. Il incombe au développeur d'utiliser ces informations pour basculer du mode ad hoc au mode managé.
DiscoveryEndpoint
DiscoveryEndpoint représente un point de terminaison standard avec un contrat de découverte fixe. Il est utilisé par un service ou un client pour envoyer ou recevoir des messages de découverte. Par défaut, DiscoveryEndpoint est défini pour utiliser le mode ServiceDiscoveryMode.Managed et la version 11 du protocole WS-Discovery.
DiscoveryMessageSequenceGenerator
DiscoveryMessageSequenceGenerator est utilisé pour générer un DiscoveryMessageSequence lorsque le service envoie des messages de découverte ou d'annonce.
DiscoveryService
La classe abstraite DiscoveryService fournit une infrastructure pour recevoir et traiter des messages Probe
et Resolve
. Lors de la réception d'un message Probe
, DiscoveryService crée une instance de FindRequestContext basée sur le message entrant et appelle la méthode virtuelle OnBeginFind. Lors de la réception d'un message Resolve
, DiscoveryService appelle la méthode virtuelle OnBeginResolve. Vous pouvez hériter de cette classe pour fournir une implémentation personnalisée du service de découverte.
DiscoveryProxy
La classe abstraite DiscoveryProxy fournit une infrastructure pour recevoir et traiter les messages de découverte et d'annonce. Vous héritez de cette classe lorsque vous implémentez un proxy de découverte personnalisé. Lorsqu'un message Probe
est reçu en multidiffusion, la classe DiscoveryProxy appelle la méthode virtuelle BeginShouldRedirectFind
pour déterminer si un message de suppression de multidiffusion doit être envoyé. Si le développeur décide de ne pas envoyer de message de suppression de multidiffusion ou si le message Probe
a été reçu en monodiffusion, il crée une instance de la classe FindRequestContext basée sur le message entrant et appelle la méthode virtuelle OnBeginFind
. Lorsqu'un message Resolve
est reçu en multidiffusion, la classe DiscoveryProxy appelle la méthode virtuelle ShouldRedirectResolve
pour déterminer si un message de suppression de multidiffusion doit être envoyé. Si le développeur décide de ne pas envoyer de message de suppression de multidiffusion ou si le message Resolve
a été reçu en monodiffusion, il crée une instance de la classe ResolveCriteria basée sur le message entrant et appelle la méthode virtuelle OnBeginResolve
. Lors de la réception d'un message de type Hello ou Bye, DiscoveryProxy appelle la méthode virtuelle appropriée (OnBeginOnlineAnnouncement
ou OnBeingOfflineAnnouncement
), qui déclenche des événements d'annonce.
DiscoveryVersion
La classe DiscoveryVersion représente la version du protocole de découverte à utiliser.
EndpointDiscoveryBehavior
La classe EndpointDiscoveryBehavior est utilisée pour contrôler la détectabilité d’un point de terminaison, spécifier les extensions, les noms supplémentaires de type de contrat. et les étendues associées à ce point de terminaison. Ce comportement est ajouté à un point de terminaison d'application pour configurer son EndpointDiscoveryMetadata. Lorsque ServiceDiscoveryBehavior est ajouté à l'hôte de service, tous les points de terminaison d'application hébergés par défaut par l'hôte de service deviennent détectables. Le développeur peut désactiver la découverte pour un point de terminaison spécifique en définissant la propriété Enabled sur false
.
EndpointDiscoveryMetadata
La classe EndpointDiscoveryMetadata fournit une représentation d'un point de terminaison publié par le service, de manière indépendante de la version. Elle contient des adresses du point de terminaison, des URI d’écoute, des noms de type de contrat, des étendues, une version de métadonnées et des extensions spécifiés par le développeur de service. Le FindCriteria envoyé par le client lors d'une opération Probe
est comparé au EndpointDiscoveryMetadata. Si les critères correspondent, le EndpointDiscoveryMetadata est retourné au client. L'adresse du point de terminaison dans ResolveCriteria est comparée à l'adresse du point de terminaison de EndpointDiscoveryMetadata. Si les critères correspondent, le EndpointDiscoveryMetadata est retourné au client.
FindCriteria
La classe FindCriteria est une classe indépendante de la version, qui permet de spécifier les critères utilisés lors de la recherche d'un service. Elle prend entièrement en charge les critères définis par WS-Discovery pour correspondre aux services. Elle possède également des extensions qui permettent aux développeurs de spécifier des valeurs personnalisées qui peuvent être utilisées lors du processus de mise en correspondance. Le développeur peut fournir les critères d'arrêt pour l'opération Find
en spécifiant la propriété MaxResults, qui indique le nombre total de services recherchés par le développeur ou spécifie la valeur Duration, qui correspond à la durée pendant laquelle le client attend des réponses.
FindRequestContext
La classe FindRequestContext est instanciée par le service de découverte en fonction du message Probe
qu'il reçoit lorsqu'un client initialise une opération Find
. Il contient une instance de FindCriteria qui a été spécifiée par le client.
FindResponse
La classe FindResponse est retournée par l'appelant de la méthode Find avec les réponses de l'opération Find
. Elle est également présente dans FindCompletedEventArgs. Elle contient une collection EndpointDiscoveryMetadata, qui est la collection des points de terminaison découverts et un dictionnaire d’objets EndpointDiscoveryMetadata et DiscoveryMessageSequence.
ResolveCriteria
La classe ResolveCriteria est une classe indépendante de la version qui permet de spécifier les critères utilisés lors de la résolution d'un service déjà connu. Elle contient l'adresse du point de terminaison du service connu. Le développeur peut fournir les critères d'arrêt pour l'opération de résolution en spécifiant la propriété Duration, qui indique combien de temps le client attend des réponses.
ResolveResponse
La classe ResolveResponse est retournée par l'appelant de la méthode Resolve avec la réponse de l'opération Resolve
. Elle est également présente dans ResolveCompletedEventArgs. Elle contient une instance de EndpointDiscoveryMetadata, qui correspond aux points de terminaison découverts et une instance de DiscoveryMessageSequence.
ServiceDiscoveryBehavior
La classe ServiceDiscoveryBehavior permet au développeur d'ajouter à un service la fonctionnalité de découverte. Vous ajoutez ce comportement à l'objet ServiceHost. La classe ServiceDiscoveryBehavior effectue une itération sur les points de terminaison d’application ajoutés à l’hôte de service et crée une collection d’objets EndpointDiscoveryMetadata à partir des points de terminaison détectables. Tous les points de terminaison sont détectables par défaut. La détectabilité d'un point de terminaison particulier peut être contrôlée en ajoutant l'objet EndpointDiscoveryBehavior à ce point de terminaison particulier. Si des points de terminaison d'annonce sont ajoutés à l'objet ServiceDiscoveryBehavior, l'annonce de tous les points de terminaison détectables est envoyée sur chacun des points de terminaison d'annonce lors de l'ouverture et de la fermeture de l'hôte de service.
UdpAnnouncementEndpoint
La classe UdpAnnouncementEndpoint est un point de terminaison d’annonce standard, préconfiguré pour l’annonce sur une liaison de multidiffusion UDP. Par défaut, UdpAnnouncementEndpoint est définie pour utiliser la version d'avril 2005 du protocole WS_Discovery.
UdpDiscoveryEndpoint
La classe UdpDiscoveryEndpoint est un point de terminaison de découverte standard, préconfiguré pour la découverte sur une liaison de multidiffusion UDP. Par défaut, DiscoveryEndpoint est définie pour utiliser la version 11 du protocole WS-Discovery et le mode ServiceDiscoveryMode.Adhoc.