Benutzerdefinierte Suchkriterien
Das CustomFindCriteria-Beispiel veranschaulicht, wie eine benutzerdefinierte Bereichsübereinstimmung mithilfe von Logik erstellt wird und wie ein benutzerdefinierter Suchdienst implementiert wird. Clients verfeinern mithilfe der Funktionalität für benutzerdefinierte Bereichsübereinstimmungen die vom System bereitgestellten Suchfunktionen der WCF-Suche und bauen diese zusätzlich aus. In diesem Beispiel wird folgendes Szenario behandelt:
Ein Client sucht nach einem Rechnerdienst.
Zur Verfeinerung der Suche muss der Client eine Regel für eine benutzerdefinierte Bereichsübereinstimmung verwenden.
Nach dieser Regel sendet ein Dienst eine Antwort an den Client, wenn sein Endpunkt mit einem der vom Client angegebenen Bereiche übereinstimmt.
Zeigt
Es wird ein benutzerdefinierter Suchdienst erstellt.
Es wird eine benutzerdefinierte Bereichsübereinstimmung nach Algorithmus implementiert.
Diskussion (Discussion)
Der Client sucht nach übereinstimmenden Kriterien für den Typ „ODER“. Ein Dienst sendet eine Antwort, wenn die Bereiche seiner Endpunkten mit einem der vom Client angegebenen Bereiche übereinstimmen. In diesem Fall sucht der Client nach einem Rechnerdienst mit einem der Bereiche in der folgenden Liste:
net.tcp://Microsoft.Samples.Discovery/RedmondLocation
net.tcp://Microsoft.Samples.Discovery/SeattleLocation
net.tcp://Microsoft.Samples.Discovery/PortlandLocation
Damit dies erzielt werden kann, weist der Client Dienste an, eine Regel für die benutzerdefinierte Bereichsübereinstimmung zu verwenden, indem eine benutzerdefinierte Bereichsübereinstimmung nach URI übergeben wird. Um die benutzerdefinierte Bereichsübereinstimmung zu erleichtern, muss vom Dienst ein benutzerdefinierter Suchdienst verwendet werden, der die Regel für die benutzerdefinierte Bereichsübereinstimmung nachvollziehen kann und die zugehörige Übereinstimmungslogik implementiert.
Öffnen Sie im Clientprojekt die Datei Program.cs. Beachten Sie, dass das ScopeMatchBy
-Feld des FindCriteria
-Objekts auf einen bestimmten URI festgelegt wird. Dieser Bezeichner wird an den Dienst gesendet. Wenn der Dienst diese Regel nicht versteht, ignoriert er die Suchanforderung des Clients.
Öffnen Sie das Dienstprojekt. Für die Implementierung des benutzerdefinierten Suchdiensts werden drei Dateien verwendet:
AsyncResult.cs Die Implementierung des
AsyncResult
, das für Suchmethoden erforderlich ist.CustomDiscoveryService.cs: Diese Datei implementiert den benutzerdefinierten Suchdienst. Die Implementierung erweitert die DiscoveryService-Klasse und überschreibt die erforderlichen Methoden. Beachten Sie die Implementierung der OnBeginFind-Methode. Die Methode überprüft, ob die benutzerdefinierte Bereichsübereinstimmung der Regel vom Client angegeben wurde. Dabei handelt es sich um den gleichen benutzerdefinierten URI, den der Client zuvor angegeben hat. Wenn die benutzerdefinierte Regel angegeben wird, folgt darauf der Codepfad, mit dem die „ODER“-Übereinstimmungslogik implementiert wird.
Diese benutzerdefinierte Logik durchläuft sämtliche Bereiche der einzelnen Endpunkte, über die der Dienst verfügt. Wenn einer der Bereiche des Endpunkts mit einem der vom Client angegebenen Bereiche übereinstimmt, fügt der Suchdienst diesen Endpunkt der Antwort hinzu, die an den Client zurückgesendet wird.
CustomDiscoveryExtension.cs: Der letzte Schritt bei der Implementierung des Suchdiensts besteht darin, eine Verbindung zwischen der Implementierung des benutzerdefinierten Suchdiensts mit dem Diensthost herzustellen. Die hier verwendete Hilfsklasse ist die
CustomDiscoveryExtension
-Klasse. Mit dieser Klasse wird die DiscoveryServiceExtension-Klasse erweitert. Der Benutzer muss die GetDiscoveryService-Methode überschreiben. In diesem Fall gibt die Methode eine Instanz des benutzerdefinierten Ermittlungsdiensts zurück, der zuvor erstellt wurde.PublishedEndpoints
ist eine ReadOnlyCollection<T>, die alle dem ServiceHost hinzugefügten Anwendungsendpunkte enthält. Der benutzerdefinierte Suchdienst füllt damit seine interne Liste auf. Ein Benutzer kann auch weitere Endpunktmetadaten hinzufügen.
Öffnen Sie als letzten Schritt die Datei Program.cs. Beachten Sie, dass sowohl ServiceDiscoveryBehavior als auch CustomDiscoveryExtension
dem Host hinzugefügt werden. Sobald dies erfolgt ist und der Host über einen Endpunkt verfügt, über den Suchmeldungen empfangen werden können, kann der benutzerdefinierte Suchdienst von der Anwendung verwendet werden.
Beachten Sie, dass der Client den Dienst ermitteln kann, ohne seine Adresse zu kennen.
So können Sie das Beispiel einrichten, erstellen und ausführen
Öffnen Sie die Projektmappe, die das Projekt enthält.
Erstellen Sie das Projekt.
Führen Sie die Dienstanwendung aus.
Führen Sie die Clientanwendung aus.