Discovery Find and FindCriteria
Een detectiebewerking wordt gestart door een client om een of meer services te detecteren en is een van de belangrijkste acties in detectie. Als u een zoekbewerking uitvoert, wordt een WS-Discovery Probe-bericht via het netwerk verzonden. Services die voldoen aan de criteria die zijn opgegeven beantwoorden met WS-Discovery ProbeMatch-berichten. Zie de WS-Discovery-specificatie voor meer informatie over detectieberichten.
DiscoveryClient
De DiscoveryClient klasse biedt het mechanisme voor het uitvoeren van zoekbewerkingen en maakt het uitvoeren van detectieclientbewerkingen eenvoudig. Het bevat een Find methode, die een (blokkerende) synchrone zoekbewerking uitvoert en een FindAsync methode, waarmee een niet-blokkerende asynchrone zoekbewerking wordt gestart. Beide methoden nemen een FindCriteria parameter en bieden resultaten aan de gebruiker via een FindResponse object.
FindCriteria
FindCriteria heeft verschillende eigenschappen, die kunnen worden gegroepeerd in zoekcriteria, die aangeven welke services u zoekt en beëindigingscriteria zoeken (hoe lang de zoekopdracht moet duren). Een FindCriteria kan meerdere zoekcriteria bevatten. Standaard moet de service overeenkomen met alle onderdelen, anders beschouwt de service zichzelf niet als een overeenkomende service. Als u services wilt zoeken die alleen voldoen aan een deel van de criteria, kunt u aangepaste zoeklogica implementeren in de service of u kunt meerdere query's gebruiken.
Zoekcriteria zijn onder andere:
ContractTypeNameElement -Optionele. De contractnaam van de service die wordt doorzocht en de criteria die doorgaans worden gebruikt bij het zoeken naar een service. Als er meer dan één contractnaam is opgegeven, worden alleen service-eindpunten opgegeven die overeenkomen met het antwoord op ALLE contracten. Houd er rekening mee dat in WCF een eindpunt slechts één contract kan ondersteunen.
ScopeElement -Optionele. Bereiken zijn absolute URI's die worden gebruikt om afzonderlijke service-eindpunten te categoriseren. U kunt dit gebruiken in scenario's waarin meerdere eindpunten hetzelfde contract beschikbaar maken en u een manier wilt om te zoeken naar een subset van de eindpunten. Als er meer dan één bereik is opgegeven, beantwoorden alleen service-eindpunten die overeenkomen met ALLE bereiken.
ScopeMatchBy - Hiermee geeft u het overeenkomende algoritme dat moet worden gebruikt tijdens het vergelijken van de bereiken in het testbericht met die van het eindpunt. Er zijn vijf ondersteunde regels voor bereikkoppeling:
FindCriteria.ScopeMatchByExact voert een eenvoudige hoofdlettergevoelige tekenreeksvergelijking uit.
FindCriteria.ScopeMatchByPrefix komt overeen met segmenten gescheiden door '/'. Een zoekactie komt
http://contoso/building1
overeen met een service met bereikhttp://contoso/building/floor1
. Houd er rekening mee dat deze niet overeenkomthttp://contoso/building100
omdat de laatste twee segmenten niet overeenkomen.FindCriteria.ScopeMatchByLdap komt overeen met bereiken per segment met behulp van een LDAP-URL.
FindCriteria.ScopeMatchByUuid komt exact overeen met bereiken met behulp van een UUID-tekenreeks.
FindCriteria.ScopeMatchByNone komt alleen overeen met de services die geen bereik opgeven.
Als er geen bereikkoppelingsregel is opgegeven, ScopeMatchByPrefix wordt deze gebruikt.
Beëindigingscriteria zijn onder andere:
Duration - De maximale tijd die moet worden gewacht op antwoorden van services in het netwerk. De standaardduur is 20 seconden.
MaxResults - Het maximum aantal antwoorden dat moet worden gewacht. Als MaxResults antwoorden worden ontvangen voordat Duration ze zijn verstreken, wordt de zoekbewerking beëindigd.
FindResponse
FindResponse heeft een Endpoints verzamelingseigenschap die antwoorden bevat die worden verzonden door overeenkomende services in het netwerk. Als er geen services hebben gereageerd, is de verzameling leeg. Als een of meer services hebben gereageerd, wordt elk antwoord opgeslagen in een EndpointDiscoveryMetadata object, dat het adres, contract en aanvullende informatie over de service bevat.
In het volgende voorbeeld ziet u hoe u een zoekbewerking uitvoert in code.
// 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)