Objektmodell der WCF-Suche

Die WCF-Suche besteht aus einer Reihe 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 ServiceDiscoveryBehavior-Objekt des Diensthosts ein ServiceDescription 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:

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 Find an den Aufrufer des FindResponse-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 Resolve an den Aufrufer des ResolveResponse-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 ServiceDiscoveryMode.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 Ermittelbarkeit 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 Enabled-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 FindCriteria-Vorgangs gesendete Probe-Objekt wid mit dem EndpointDiscoveryMetadata-Objekt verglichen. Wenn die Kriterien übereinstimmen, wird das EndpointDiscoveryMetadata-Objekt an den Client zurückgegeben. Die Endpunktadresse in ResolveCriteria wird mit der Endpunktadresse von EndpointDiscoveryMetadata 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 MaxResults 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.

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 ServiceDiscoveryMode.Adhoc-Modus verwendet wird.