Freigeben über


Suche und FindCriteria

Ein Suchvorgang wird von einem Client initiiert, um einen oder mehrere Dienste zu ermitteln, und ist eine der Hauptaktionen bei der Suche. Beim Durchführen einer Suche wird eine WS-Discovery-Probe-Nachricht über das Netzwerk gesendet. Dienste, die die angegebenen Kriterien erfüllen, antworten mit WS-Discovery-ProbeMatch-Nachrichten. Weitere Informationen zu Ermittlungsmeldungen finden Sie in der Spezifikation zur WS-Ermittlung.

DiscoveryClient

Die DiscoveryClient-Klasse stellt den Mechanismus zur Durchführung von Suchvorgängen bereit und ermöglicht eine einfache Durchführung von Suchclientvorgängen. Sie enthält eine Find-Methode, die eine synchrone (blockierende) Suche ausführt, und eine FindAsync-Methode, die eine asynchrone (nicht blockierende) Suche initiiert. Beide Methoden verwenden einen FindCriteria-Parameter und stellen dem Benutzer Ergebnisse über ein FindResponse-Objekt bereit.

FindCriteria

FindCriteria verfügt über mehrere Eigenschaften, die nach Suchkriterien (nach welchen Diensten soll gesucht werden) und Beendigungskriterien für die Suche (wie lange soll die Suche dauern) gruppiert werden können. Ein FindCriteria-Objekt kann mehrere Suchkriterien enthalten. Standardmäßig muss der Dienst mit allen Komponenten übereinstimmen, da es sich sonst nicht um einen übereinstimmenden Dienst handelt. Falls Sie nach Diensten suchen möchten, die nur einige Kriterien erfüllen, können Sie für den Dienst eine benutzerdefinierte Suchlogik implementieren, oder Sie können mehrere Abfragen verwenden.

Zu den Suchkriterien gehört Folgendes:

  • ContractTypeNameElement – Optional. Der Vertragsname des Diensts, nach dem gesucht wird, und die Kriterien, die normalerweise beim Suchen nach einem Dienst verwendet werden. Wenn mehr als ein Vertragsname angegeben wird, antworten nur Dienstendpunkte, die mit ALLEN Verträgen übereinstimmen. Beachten Sie, dass ein Endpunkt in WCF nur einen Vertrag unterstützen kann.

  • ScopeElement – Optional. Bereiche sind absolute URIs, die verwendet werden, um einzelne Dienstendpunkte zu kategorisieren. Dies ist in Szenarien nützlich, in denen mehrere Endpunkte den gleichen Vertrag verfügbar machen und in denen Sie nach einer Möglichkeit suchen, nach einer Teilmenge der Endpunkte zu suchen. Wenn mehr als ein Bereich angegeben wird, antworten nur Dienstendpunkte, die mit ALLEN Bereichen übereinstimmen.

  • ScopeMatchBy – Gibt an, welcher Übereinstimmungsalgorithmus verwendet werden soll, während die Übereinstimmung der Bereiche der Probe-Nachricht mit denen des Endpunkts ermittelt wird. Es gibt fünf unterstützte Bereichsübereinstimmungsregeln:

    • FindCriteria.ScopeMatchByExact führt einen grundlegenden Zeichenfolgenvergleich aus, bei dem die Groß-/Kleinschreibung beachtet wird.

    • FindCriteria.ScopeMatchByPrefix ermittelt Übereinstimmungen nach Segmenten, die mit „/“ voneinander getrennt sind. Eine Suche nach http://contoso/building1 entspricht einem Dienst mit Dem Bereich http://contoso/building/floor1. Beachten Sie, dass für http://contoso/building100 keine Übereinstimmung gefunden wird, da die letzten beiden Segmente nicht übereinstimmen.

    • FindCriteria.ScopeMatchByLdap ermittelt für Bereiche Übereinstimmungen nach Segmenten unter Verwendung einer LDAP-URL.

    • FindCriteria.ScopeMatchByUuid ermittelt mithilfe einer UUID-Zeichenfolge genaue Übereinstimmungen für Bereiche.

    • FindCriteria.ScopeMatchByNone ermittelt nur Übereinstimmungen für Dienste, die keinen Bereich angeben.

    Wenn keine Bereichsübereinstimmungsregel angegeben wird, wird ScopeMatchByPrefix verwendet.

Zu den Beendigungskriterien gehört Folgendes:

  1. Duration – Der maximale Zeitraum, wie lange auf Antworten der Dienste im Netzwerk gewartet wird. Der Standardzeitraum beträgt 20 Sekunden.

  2. MaxResults – Die maximale Anzahl von Antworten, auf die gewartet wird. Wenn MaxResults-Antworten empfangen werden, bevor die Duration verstrichen ist, endet der Suchvorgang.

FindResponse

FindResponse verfügt über eine Endpoints-Auflistungseigenschaft, die alle Antworten enthält, die von übereinstimmenden Diensten im Netzwerk gesendet werden. Falls keine Dienste antworten, ist die Auflistung leer. Falls ein oder mehrere Dienste antworteten, wird jede Antwort in einem EndpointDiscoveryMetadata-Objekt gespeichert. Dieses Objekt enthält die Adresse, den Vertrag und einige weitere Informationen zum Dienst.

Im folgenden Beispiel wird gezeigt, wie Sie einen Suchvorgang per Code ausführen.

// Create DiscoveryClient
DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());

// Create FindCriteria
FindCriteria findCriteria = new FindCriteria(typeof(IPrinterService));
findCriteria.Scopes.Add(new Uri("http://www.contoso.com/building1/floor1"));
findCriteria.Duration = TimeSpan.FromSeconds(10);

// Find ICalculatorService endpoints
FindResponse findResponse = discoveryClient.Find(findCriteria);

Console.WriteLine("Found {0} ICalculatorService endpoint(s).", findResponse.Endpoints.Count)

Weitere Informationen