Objektmodell der WCF-Suche
Die WCF-Suche besteht aus einem Satz von Typen, die zusammen ein einheitliches Programmiermodell bereitstellen. Damit können Sie Dienste schreiben, die zur Laufzeit erkennbar sind, sowie Clients, die nach diesen Diensten suchen und diese verwenden.
Erkennbarmachen eines Diensts und Suchen nach Diensten
Um einen WCF-Dienst erkennbar zu machen, fügen Sie dem ServiceDescription-Objekt des Diensthosts ein ServiceDiscoveryBehavior sowie einen Suchendpunkt hinzu. Wenn ein Dienst so konfiguriert wird, dass er Ankündigungsnachrichten sendet (durch das Hinzufügen eines AnnouncementEndpoint-Objekts), wird die Ankündigung jeweils gesendet, wenn der Diensthost geöffnet oder geschlossen wird.
Ein Client, der eine Überwachung auf Ankündigungsnachrichten von Diensten durchführt, hostet einen Ankündigungsdienst und fügt einen oder mehrere Ankündigungsendpunkte hinzu. Der Ankündigungsdienst empfängt Ankündigungsnachrichten und löst Ankündigungsereignisse aus.
Ein Client verwendet die DiscoveryClient-Klasse, um nach verfügbaren Diensten zu suchen. Die Clientanwendung instanziiert die DiscoveryClient-Klasse, indem sie einen Suchendpunkt übergibt. Dieser Suchendpunkt gibt an, wohin die Suchnachrichten gesendet werden sollen. Der Client ruft die Find-Methode auf, die eine Probe-Anforderung sendet. Dienste, die eine Überwachung auf Suchnachrichten durchführen, empfangen diese Probe-Anforderung. Falls der Dienst die unter Probe angegebenen Kriterien erfüllt, sendet er eine ProbeMatch-Nachricht zurück an den Client.
Objektmodell
Die API der WCF-Suche definiert die folgenden Klassen:
AnnouncementEndpoint
DiscoveryClient
ServiceDiscoveryBehavior
AnnouncementClient
Die AnnouncementClient-Klasse stellt synchrone und asynchrone Methoden zum Senden von Ankündigungsnachrichten bereit. Es gibt zwei Typen von Ankündigungsnachrichten: "Hello" und "Bye". Eine Hello-Nachricht wird gesendet, um anzugeben, dass ein Dienst verfügbar geworden ist, und eine Bye-Nachricht wird gesendet, um anzugeben, dass ein vorhandener Dienst nicht mehr verfügbar ist. Der Entwickler erstellt eine AnnouncementClient-Instanz und übergibt eine Instanz von AnnouncementEndpoint als Konstruktorparameter.
AnnouncementEndpoint
AnnouncementEndpoint stellt einen Standardendpunkt mit einem festen Ankündigungsvertrag dar. Dieser wird von einem Dienst oder Client zum Senden und Empfangen von Ankündigungsnachrichten verwendet. Standardmäßig ist für die AnnouncementEndpoint-Klasse festgelegt, dass sie die Protokollversion "WS_Discovery 11" verwendet.
AnnouncementService
AnnouncementService ist eine vom System bereitgestellte Implementierung eines Ankündigungsdiensts, der Ankündigungsnachrichten empfängt und verarbeitet. Wenn eine Hello- oder Bye-Nachricht empfangen wird, ruft die AnnouncementService-Instanz die entsprechende virtuelle OnBeginOnlineAnnouncement- oder OnBeginOfflineAnnouncement-Methode auf, die Ankündigungsereignisse auslös.
DiscoveryClient
Die DiscoveryClient-Klasse wird von einer Clientanwendung verwendet, um verfügbare Dienste zu suchen und aufzulösen. Sie stellt synchrone und asynchrone Methoden zum Suchen nach und zum Auflösen von Diensten bereit, die auf dem angegebenen FindCriteria-Objekt oder ResolveCriteria-Objekt basieren. Der Entwickler erstellt eine DiscoveryClient-Instanz und stellt eine Instanz von DiscoveryEndpoint als Konstruktorparameter bereit.
Zum Suchen nach einem Dienst ruft der Entwickler die synchrone oder asynchrone Find-Methode auf, die eine FindCriteria-Instanz mit den zu verwendenden Suchkriterien bereitstellt. Das DiscoveryClient-Objekt erstellt eine Probe-Nachricht mit den entsprechenden Headern und sendet die Suchanforderung. Da es gleichzeitig mehr als eine ausstehende Find-Anforderung geben kann, korreliert der Client die empfangenen Antworten und überprüft jeweils die Antwort. Anschließend werden die Ergebnisse mithilfe von FindResponse an den Aufrufer des Find-Vorgangs übermittelt.
Um einen bekannten Dienst aufzulösen, ruft der Entwickler die synchrone oder asynchrone Resolve-Methode auf, die eine Instanz von ResolveCriteria bereitstellt, die wiederum das EndpointAddress-Objekt des bekannten Diensts enthält. Das DiscoveryClient-Objekt erstellt eine Resolve-Nachricht mit den entsprechenden Headern und sendet die Auflösungsanforderung. Die empfangene Antwort wird mit den ausstehenden Auflösungsanforderungen korreliert, und das Ergebnis wird mithilfe von ResolveResponse an den Aufrufer des Resolve-Vorgangs übermittelt.
Wenn im Netzwerk ein Suchproxy vorhanden ist und der DiscoveryClient die Suchanforderung im Multicastformat sendet, kann der Suchproxy per Multicastunterdrückung mit Hello-Nachricht antworten. Der DiscoveryClient löst das ProxyAvailable-Ereignis aus, wenn er Hello-Nachrichten als Antwort auf ausstehende Find- oder Resolve-Anforderungen empfängt. Das ProxyAvailable-Ereignis enthält die EndpointDiscoveryMetadata zum Suchproxy. Der Entwickler kann entscheiden, ob er diese Informationen zum Wechseln vom Ad-hoc-Modus in den Modus "Verwaltet" verwendet.
DiscoveryEndpoint
DiscoveryEndpoint stellt einen Standardendpunkt mit einem festen Suchvertrag dar. Er wird von einem Dienst oder einem Client verwendet, um Suchnachrichten zu senden oder zu empfangen. Standardmäßig wird DiscoveryEndpoint festgelegt, um den Managed-Modus und die Version "WSDiscovery11" der WS-Suche zu verwenden.
DiscoveryMessageSequenceGenerator
DiscoveryMessageSequenceGenerator wird verwendet, um ein DiscoveryMessageSequence-Objekt zu generieren, wenn der Dienst Such- oder Ankündigungsnachrichten sendet.
DiscoveryService
Die abstrakte DiscoveryService-Klasse stellt ein Framework zum Empfangen und Verarbeiten von Probe- und Resolve-Nachrichten bereit. Wenn eine Probe-Nachricht empfangen wird, erstellt DiscoveryService basierend auf der eingehenden Meldung eine Instanz von FindRequestContext und ruft die virtuelle OnBeginFind-Methode auf. Wenn eine Resolve-Nachricht empfangen wird, ruft DiscoveryService die virtuelle OnBeginResolve-Methode auf. Sie können von dieser Klasse erben, um eine benutzerdefinierte Suchdienstimplementierung bereitzustellen.
DiscoveryProxy
Die abstrakte DiscoveryProxy-Klasse stellt ein Framework zum Empfangen und Verarbeiten von Suche- und Ankündigungsnachrichten bereit. Sie erben von dieser Klasse, wenn Sie einen benutzerdefinierten Suchproxy implementieren. Wenn eine Probe-Nachricht per Multicast empfangen wird, ruft die DiscoveryProxy-Klasse die virtuelle BeginShouldRedirectFind-Methode auf, um zu ermitteln, ob eine Multicastunterdrückungsnachricht gesendet werden soll. Wenn sich der Entwickler gegen das Senden einer Multicastunterdrückungsnachricht entscheidet oder wenn die Probe-Nachricht per Unicast empfangen wurde, wird basierend auf der eingehenden Nachricht eine Instanz der FindRequestContext-Klasse erstellt und die virtuelle OnBeginFind-Methode aufgerufen. Wenn eine Resolve-Nachricht per Multicast empfangen wird, ruft die DiscoveryProxy-Klasse die virtuelle ShouldRedirectResolve-Methode auf, um zu ermitteln, ob eine Multicastunterdrückungsnachricht gesendet werden soll. Wenn sich der Entwickler gegen das Senden einer Multicastunterdrückungsnachricht entscheidet oder wenn die Resolve-Nachricht per Unicast empfangen wurde, wird basierend auf der eingehenden Nachricht eine Instanz der ResolveCriteria-Klasse erstellt und die virtuelle OnBeginResolve-Methode aufgerufen. Wenn eine Hello- oder Bye-Nachricht empfangen wird, ruft DiscoveryProxy die entsprechende virtuelle Methode (OnBeginOnlineAnnouncement oder OnBeingOfflineAnnouncement) auf, die Ankündigungsereignisse auslöst.
DiscoveryVersion
Die DiscoveryVersion-Klasse stellt die zu verwendende Suchprotokollversion dar.
EndpointDiscoveryBehavior
Die EndpointDiscoveryBehavior-Klasse wird verwendet, um die Erkennbarkeit eines Endpunkts zu steuern und um die Erweiterungen, zusätzliche Vertragstypnamen und die dem Endpunkt zugeordneten Bereiche anzugeben. Dieses Verhalten wird einem Anwendungsendpunkt hinzugefügt, um seine EndpointDiscoveryMetadata zu konfigurieren. Wenn das ServiceDiscoveryBehavior dem Diensthost hinzugefügt wird, werden alle vom Diensthost gehosteten Anwendungsendpunkte standardmäßig erkennbar. Der Entwickler kann die Suche für einen bestimmten Endpunkt deaktivieren, indem er die Enable-Eigenschaft auf false festlegt.
EndpointDiscoveryMetadata
Die EndpointDiscoveryMetadata-Klasse stellt eine versionsunabhängige Darstellung eines Endpunkts bereit, der vom Dienst veröffentlicht wurde. Sie enthält Endpunktadressen, Abhör-URIs, Vertragstypnamen, Bereiche, Metadatenversion und Erweiterungen, die vom Dienstentwickler angegeben wurden. Das vom Client während eines Probe-Vorgangs gesendete FindCriteria-Objekt wid mit dem EndpointDiscoveryMetadata-Objekt verglichen. Wenn die Kriterien übereinstimmen, wird das EndpointDiscoveryMetadata-Objekt an den Client zurückgegeben. Die Endpunktadresse in EndpointDiscoveryMetadata wird mit der Endpunktadresse von ResolveCriteria verglichen. Wenn die Kriterien übereinstimmen, wird das EndpointDiscoveryMetadata-Objekt an den Client zurückgegeben.
FindCriteria
Die FindCriteria-Klasse ist eine versionsunabhängige Klasse, mit der die Kriterien angegeben werden, die beim Suchen nach einem Dienst verwendet werden. Sie bietet eine vollständige Unterstützung der von der WS-Suche definierten Kriterien zum Vergleichen von Diensten. Außerdem verfügt sie über Erweiterungen, mit denen Entwickler benutzerdefinierte Werte angeben können, die während des Prozesses zur Ermittlung von Übereinstimmungen verwendet werden. Der Entwickler kann die Beendigungskriterien für den Find-Vorgang bereitstellen, indem er MaxResult angibt. Damit wird die Gesamtzahl der Dienste angegeben, nach denen der Entwickler sucht, oder Duration. Dies ist der Wert ist, der angibt, wie lange der Client auf Antworten wartet.
FindRequestContext
Die FindRequestContext-Klasse wird vom Suchdienst basierend auf der Probe-Nachricht instanziiert, die diese empfängt, wenn ein Client einen Find-Vorgang initiiert. Sie enthält eine Instanz des FindCriteria-Objekts, das vom Client angegeben wurde.
FindResponse
Die FindResponse-Klasse wird an den Aufrufer von Find mit den Antworten des Find-Vorgangs zurückgegeben. Sie ist auch in FindCompletedEventArgs enthalten. Darin ist eine Auflistung von EndpointDiscoveryMetadata, wobei es sich um die Auflistung ermittelter Endpunkte und ein Wörterbuch für EndpointDiscoveryMetadata und DiscoveryMessageSequence handelt.
ResolveCriteria
Die ResolveCriteria-Klasse ist eine versionsunabhängige Klasse, mit der die Kriterien angegeben werden, die beim Auflösen eines bereits bekannten Diensts verwendet werden. Sie enthält die Endpunktadresse des bekannten Diensts. Der Entwickler kann die Beendigungskriterien für den Auflösungsvorgang bereitstellen, indem er die Duration-Eigenschaft angibt. Diese Eigenschaft legt fest, wie lange der Client auf Antworten wartet.
ResolveResponse
Das ResolveResponse-Objekt wird mit der Antwort des Resolve-Vorgangs an den Aufrufer der Resolve-Methode zurückgegeben. Sie ist auch in ResolveCompletedEventArgs enthalten. Darin ist eine Instanz von EndpointDiscoveryMetadata enthalten, wobei es sich um die ermittelten Endpunkte und eine Instanz von DiscoveryMessageSequence handelt.
ServiceDiscoveryBehavior
Mithilfe der ServiceDiscoveryBehavior-Klasse kann der Entwickler der Suchfunktion einen Dienst hinzufügen. Sie fügen dieses Verhalten dem ServiceHost-Objekt hinzu. Die ServiceDiscoveryBehavior-Klasse durchläuft die Anwendungsendpunkte, die dem Diensthost hinzugefügt wurden, und erstellt aus den erkennbaren Endpunkten eine Auflistung von EndpointDiscoveryMetadata. Alle Endpunkte sind standardmäßig erkennbar. Sie können die Erkennbarkeit eines bestimmten Endpunkts steuern, indem Sie dem jeweiligen Endpunkt EndpointDiscoveryBehavior hinzufügen. Falls ServiceDiscoveryBehavior Ankündigungsendpunkte hinzugefügt werden, wird die Ankündigung aller erkennbaren Endpunkte jeweils über jeden einzelnen Ankündigungsendpunkt gesendet, wenn der Diensthost geöffnet oder geschlossen wird.
ServiceDiscoveryExtension
Die ServiceDiscoveryExtension-Klasse wird von der ServiceDiscoveryBehavior-Klasse ersetzt. Die Endpunkte, die erkennbar gemacht werden, können von ServiceDiscoveryExtension abgerufen werden. Diese Klasse wird auch verwendet, um eine benutzerdefinierte Suchdienstimplementierung anzugeben.
UdpAnnouncementEndpoint
Die UdpAnnouncementEndpoint-Klasse ist ein standardmäßiger Ankündigungsendpunkt, der für die Ankündigung über eine UDP-Multicastbindung vorkonfiguriert ist. Standardmäßig ist UdpAnnouncementEndpoint auf die Verwendung der WS_Discovery-Version "WSApril2005" festgelegt.
UdpDiscoveryEndpoint
Die UdpDiscoveryEndpoint-Klasse ist ein Standardsuchendpunkt, der für die Suche über eine UDP-Multicastbindung vorkonfiguriert ist. Standardmäßig wird DiscoveryEndpoint so festgelegt, dass die Version "WSDiscovery11" der WS-Suche und der Adhoc-Modus verwendet wird.