Benutzerdefinierte SuchkriterienCustom Find Criteria

In diesem Beispiel wird veranschaulicht, wie eine benutzerdefinierte Bereichsübereinstimmung mithilfe von Logik erstellt wird und wie ein benutzerdefinierter Suchdienst implementiert wird.This sample demonstrates how to create a custom scope match using logic and how to implement a custom discovery service. 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.Clients use custom scope matching functionality to refine and further build on top of the system-provided find functionality of WCF Discovery. In diesem Beispiel wird folgendes Szenario behandelt:The scenario this sample covers is as follows:

  1. Ein Client sucht nach einem Rechnerdienst.A client is looking for a calculator service.

  2. Zur Verfeinerung der Suche muss der Client eine Regel für eine benutzerdefinierte Bereichsübereinstimmung verwenden.To refine its search, the client must use a custom scope matching rule.

  3. Nach dieser Regel sendet ein Dienst eine Antwort an den Client, wenn sein Endpunkt mit einem der vom Client angegebenen Bereiche übereinstimmt.According to this rule, a service responds back to the client if its endpoint matches any of the scopes specified by the client.

VeranschaulichtDemonstrates

  • Es wird ein benutzerdefinierter Suchdienst erstellt.Creating a custom discovery service.

  • Es wird eine benutzerdefinierte Bereichsübereinstimmung nach Algorithmus implementiert.Implementing a custom scope match by algorithm.

DiskussionDiscussion

Der Client sucht nach Übereinstimmungskriterien "OR"-Typ.The client is looking for "OR" type matching criteria. Ein Dienst sendet eine Antwort, wenn die Bereiche seiner Endpunkten mit einem der vom Client angegebenen Bereiche übereinstimmen.A service responds back if the scopes on its endpoints match any of the scopes provided by the client. In diesem Fall sucht der Client nach einem Rechnerdienst mit einem der Bereiche in der folgenden Liste:In this case, the client is looking for a calculator service that has any of the scopes in the following list:

  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.To accomplish this, the client directs services to use a custom scope matching rule by passing in a custom scope match by URI. 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.To facilitate the custom scope matching, the service must use a custom discovery service that understands the custom scope match rule and implements the associated matching logic.

Öffnen Sie im Clientprojekt die Datei Program.cs.In the client project, open the Program.cs file. Beachten Sie, dass das ScopeMatchBy-Feld des FindCriteria-Objekts auf einen bestimmten URI festgelegt wird.Note that the ScopeMatchBy field of the FindCriteria object is set to a specific URI. Dieser Bezeichner wird an den Dienst gesendet.This identifier is sent to the service. Wenn der Dienst diese Regel nicht versteht, ignoriert er die Suchanforderung des Clients.If the service does not understand this rule, it ignores the client’s find request.

Öffnen Sie das Dienstprojekt.Open the service project. Für die Implementierung des benutzerdefinierten Suchdiensts werden drei Dateien verwendet:Three files are used to implement the Custom Discovery Service:

  1. AsyncResult.cs: Dies ist die Implementierung der AsyncResult Suchmethoden erforderlich ist.AsyncResult.cs: This is the implementation of the AsyncResult that is required by Discovery methods.

  2. CustomDiscoveryService.cs: Diese Datei implementiert den benutzerdefinierten Ermittlungsdienst.CustomDiscoveryService.cs: This file implements the custom discovery service. Die Implementierung erweitert die DiscoveryService-Klasse und überschreibt die erforderlichen Methoden.The implementation extends the DiscoveryService class and overrides the necessary methods. Beachten Sie die Implementierung der OnBeginFind-Methode.Note the implementation of the OnBeginFind method. Die Methode überprüft, ob die benutzerdefinierte Bereichsübereinstimmung der Regel vom Client angegeben wurde.The method checks to see whether the custom scope match by rule was specified by the client. Dabei handelt es sich um den gleichen benutzerdefinierten URI, den der Client zuvor angegeben hat.This is the same custom URI that the client specified previously. Wenn die benutzerdefinierte Regel angegeben wird, folgt der Codepfad, der mit der "OR"-Übereinstimmungslogik implementiert.If the custom rule is specified, the code path that implements the "OR" match logic is followed.

    Diese benutzerdefinierte Logik durchläuft sämtliche Bereiche der einzelnen Endpunkte, über die der Dienst verfügt.This custom logic goes through all of the scopes on each of the endpoints that the service has. 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.If any of the endpoint's scopes match any of the scopes provided by the client, the discovery service adds that endpoint to the response that is sent back to the client.

  3. CustomDiscoveryExtension.cs: der letzte Schritt in der Implementierung des Suchdiensts wird die Verbindung dieser Implementierung des benutzerdefinierten Suchdiensts mit den Diensthost.CustomDiscoveryExtension.cs: The last step in implementing the discovery service is to connect this implementation of the custom discover service to the service host. Die hier verwendete Hilfsklasse ist die CustomDiscoveryExtension-Klasse.The helper class used here is the CustomDiscoveryExtension class. Mit dieser Klasse wird die DiscoveryServiceExtension-Klasse erweitert.This class extends the DiscoveryServiceExtension class. Der Benutzer muss die GetDiscoveryService-Methode überschreiben.The user must override the GetDiscoveryService method. In diesem Fall gibt die Methode eine Instanz des benutzerdefinierten Ermittlungsdiensts zurück, der zuvor erstellt wurde.In this case, the method returns an instance of the custom discovery service that was created before. PublishedEndpoints ist eine ReadOnlyCollection<T>, die alle dem ServiceHost hinzugefügten Anwendungsendpunkte enthält.PublishedEndpoints is a ReadOnlyCollection<T> that contains all of the application endpoints that are added to the ServiceHost. Der benutzerdefinierte Suchdienst füllt damit seine interne Liste auf.The custom discovery service uses this to populate its internal list. Ein Benutzer kann auch weitere Endpunktmetadaten hinzufügen.A user can to add other endpoint metadata as well.

Öffnen Sie als letzten Schritt die Datei Program.cs.Lastly, open Program.cs. Beachten Sie, dass sowohl ServiceDiscoveryBehavior als auch CustomDiscoveryExtension dem Host hinzugefügt werden.Note that both the ServiceDiscoveryBehavior and CustomDiscoveryExtension are added to the host. 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.Once this is done and the host has an endpoint over which to receive discovery messages, the application can use the custom discovery service.

Beachten Sie, dass der Client den Dienst ermitteln kann, ohne seine Adresse zu kennen.Observe that the client is able to find the service without knowing its address.

So können Sie das Beispiel einrichten, erstellen und ausführenTo set up, build, and run the sample

  1. Öffnen Sie die Projektmappe, die das Projekt enthält.Open the solution that contains the project.

  2. Erstellen Sie das Projekt.Build the project.

  3. Führen Sie die Dienstanwendung aus.Run the service application.

  4. Führen Sie die Clientanwendung aus.Run the client application.

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your machine. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, rufen Sie Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 auf, um alle Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) - und WFWF -Beispiele herunterzuladen.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) and WFWF samples. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Discovery\CustomFindCriteria