Freigeben über


Benutzerdefinierte Suchkriterien

Im CustomFindCriteria-Beispiel wird veranschaulicht, wie ein benutzerdefinierter Bereichsabgleich mithilfe von Logik erstellt und ein benutzerdefinierter Entdeckungsdienst implementiert wird. Clients verwenden benutzerdefinierte Bereichsabgleichsfunktionen, um die vom System bereitgestellte Suchfunktionalität von WCF Discovery zu verfeinern und weiter auszubauen. Das Szenario, das in diesem Beispiel behandelt wird, ist wie folgt:

  1. Ein Kunde sucht nach einem Rechnerdienst.

  2. Um die Suche zu verfeinern, muss der Client eine benutzerdefinierte Bereichsabgleichsregel verwenden.

  3. Gemäß dieser Regel antwortet ein Dienst wieder auf den Client, wenn sein Endpunkt mit einem der vom Client angegebenen Bereiche übereinstimmt.

Zeigt

  • Erstellen eines benutzerdefinierten Ermittlungsdiensts.

  • Implementieren eines benutzerdefinierten Bereichsabgleichs durch einen Algorithmus.

Diskussion

Der Client sucht nach übereinstimmenden Kriterien vom Typ "OR". Ein Dienst antwortet zurück, wenn die Bereiche auf seinen Endpunkten mit einem der vom Client bereitgestellten Bereiche übereinstimmen. In diesem Fall sucht der Client nach einem Rechnerdienst mit einem der Bereiche in der folgenden Liste:

  1. net.tcp://Microsoft.Samples.Discovery/RedmondLocation

  2. net.tcp://Microsoft.Samples.Discovery/SeattleLocation

  3. 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 den benutzerdefinierten Bereichsabgleich zu erleichtern, muss der Dienst einen benutzerdefinierten Ermittlungsdienst verwenden, der die Regel für die benutzerdefinierte Bereichsabgleichsregel versteht und die zugeordnete Abgleichslogik implementiert.

Öffnen Sie im Clientprojekt die Program.cs Datei. Beachten Sie, dass das ScopeMatchBy Feld des FindCriteria Objekts auf einen bestimmten URI festgelegt ist. Dieser Bezeichner wird an den Dienst gesendet. Wenn der Dienst diese Regel nicht versteht, ignoriert er die Suchanforderung des Clients.

Öffnen Sie das Dienstprojekt. Drei Dateien werden verwendet, um den benutzerdefinierten Ermittlungsdienst zu implementieren:

  1. AsyncResult.cs: Dies ist die Implementierung der von Discovery-Methoden benötigten AsyncResult.

  2. CustomDiscoveryService.cs: Diese Datei implementiert den benutzerdefinierten Ermittlungsdienst. 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. Dies ist der gleiche benutzerdefinierte URI, den der Client zuvor angegeben hat. Wenn die benutzerdefinierte Regel angegeben ist, wird der Codepfad, der die Übereinstimmungslogik "OR" implementiert, befolgt.

    Diese benutzerdefinierte Logik durchläuft alle Bereiche auf jedem der Endpunkte, über die der Dienst verfügt. Wenn einer der Bereiche des Endpunkts mit einem der vom Client bereitgestellten Bereiche übereinstimmt, fügt der Ermittlungsdienst diesen Endpunkt der Antwort hinzu, die an den Client zurückgesendet wird.

  3. CustomDiscoveryExtension.cs: Der letzte Schritt bei der Implementierung des Ermittlungsdiensts besteht darin, diese Implementierung des benutzerdefinierten Ermittlungsdiensts mit dem Diensthost zu verbinden. Die hier verwendete Hilfsklasse ist die CustomDiscoveryExtension Klasse. Diese Klasse erweitert die DiscoveryServiceExtension Klasse. Der Benutzer muss die GetDiscoveryService-Methode überschreiben. In diesem Fall gibt die Methode eine Instanz des zuvor erstellten benutzerdefinierten Ermittlungsdiensts zurück. PublishedEndpoints ist ein ReadOnlyCollection<T> Element, das alle Anwendungsendpunkte enthält, die der ServiceHostAnwendung hinzugefügt werden. Der benutzerdefinierte Ermittlungsdienst verwendet dies, um die interne Liste aufzufüllen. Ein Benutzer kann auch weitere Endpunktmetadaten hinzufügen.

Öffnen Sie schließlich Program.cs. Beachten Sie, dass sowohl ServiceDiscoveryBehavior als auch CustomDiscoveryExtension zum Host hinzugefügt werden. Sobald dies erfolgt ist und der Host über einen Endpunkt verfügt, über den Discoverynachrichten empfangen werden sollen, kann die Anwendung den benutzerdefinierten Ermittlungsdienst verwenden.

Beachten Sie, dass der Client den Dienst finden kann, ohne seine Adresse zu kennen.

So können Sie das Beispiel einrichten, erstellen und ausführen

  1. Öffnen Sie die Projektmappe, die das Projekt enthält.

  2. Projekt erstellen.

  3. Führen Sie die Dienstanwendung aus.

  4. Führen Sie die Clientanwendung aus.