Odnajdywanie — znajdowanie i kryteria znajdowania
Operacja odnajdywania jest inicjowana przez klienta w celu odnalezienia co najmniej jednej usługi i jest jedną z głównych akcji odnajdywania. Wykonanie operacji znajdowania wysyła komunikat sondy odnajdywania WS za pośrednictwem sieci. Usługi spełniające określone kryteria odpowiedzi z komunikatami WS-Discovery ProbeMatch. Aby uzyskać więcej informacji na temat komunikatów odnajdywania, zobacz specyfikację odnajdywania WS-Discovery.
Discoveryclient
Klasa DiscoveryClient udostępnia mechanizm do wykonywania operacji znajdowania i ułatwia wykonywanie operacji klienta odnajdywania. Zawiera ona metodę Find , która wykonuje (blokujące) synchroniczne wyszukiwanie i metodę FindAsync , która inicjuje nieblokacyjne wyszukiwanie asynchroniczne. Obie metody przyjmują FindCriteria parametr i udostępniają użytkownikowi wyniki za pośrednictwem FindResponse obiektu.
Findcriteria
FindCriteria ma kilka właściwości, które można zgrupować w kryteria wyszukiwania, które określają, jakie usługi szukasz, i znaleźć kryteria zakończenia (jak długo wyszukiwanie powinno trwać). Element FindCriteria może zawierać wiele kryteriów wyszukiwania. Domyślnie usługa musi być zgodna ze wszystkimi składnikami. W przeciwnym razie nie bierze pod uwagę pasującej usługi. Jeśli chcesz znaleźć usługi spełniające tylko niektóre kryteria, możesz zaimplementować niestandardową logikę znajdowania w usłudze lub użyć wielu zapytań.
Kryteria wyszukiwania obejmują:
ContractTypeNameElement -Opcjonalne. Nazwa kontraktu wyszukiwanej usługi i kryteria zwykle używane podczas wyszukiwania usługi. Jeśli zostanie określona więcej niż jedna nazwa kontraktu, tylko punkty końcowe usługi pasujące do odpowiedzi WSZYSTKIE kontrakty. Należy pamiętać, że w programie WCF punkt końcowy może obsługiwać tylko jedną umowę.
ScopeElement -Opcjonalne. Zakresy to bezwzględne identyfikatory URI używane do kategoryzowania poszczególnych punktów końcowych usługi. Można to użyć w scenariuszach, w których wiele punktów końcowych uwidacznia ten sam kontrakt i chcesz wyszukać podzbiór punktów końcowych. Jeśli określono więcej niż jeden zakres, tylko punkty końcowe usługi pasujące do odpowiedzi WSZYSTKIE zakresy.
ScopeMatchBy - Określa pasujący algorytm do użycia podczas dopasowywania zakresów w komunikacie sondowania z punktem końcowym. Istnieje pięć obsługiwanych reguł dopasowywania zakresu:
FindCriteria.ScopeMatchByExact Wykonuje podstawowe porównanie ciągów z uwzględnieniem wielkości liter.
FindCriteria.ScopeMatchByPrefix dopasowanie według segmentów rozdzielonych znakami "/". Wyszukiwanie pasuje do
http://contoso/building1
usługi z zakresemhttp://contoso/building/floor1
. Należy pamiętać, że nie jest ona zgodnahttp://contoso/building100
, ponieważ dwa ostatnie segmenty nie są zgodne.FindCriteria.ScopeMatchByLdap dopasuje zakresy według segmentów przy użyciu adresu URL LDAP.
FindCriteria.ScopeMatchByUuid dopasuje zakresy dokładnie przy użyciu ciągu UUID.
FindCriteria.ScopeMatchByNone pasuje tylko do tych usług, które nie określają zakresu.
Jeśli nie określono reguły dopasowania zakresu, ScopeMatchByPrefix zostanie użyta.
Kryteria zakończenia obejmują:
Duration — Maksymalny czas oczekiwania na odpowiedzi z usług w sieci. Domyślny czas trwania to 20 sekund.
MaxResults - Maksymalna liczba odpowiedzi do oczekiwania. Jeśli MaxResults odpowiedzi zostaną odebrane przed upływem Duration , operacja find kończy się.
FindResponse
FindResponse ma właściwość kolekcji zawierającą Endpoints odpowiedzi wysyłane przez pasujące usługi w sieci. Jeśli żadna usługa nie odpowiedziała, kolekcja jest pusta. Jeśli co najmniej jedna usługa odpowiedziała, każda odpowiedź jest przechowywana w EndpointDiscoveryMetadata obiekcie zawierającym adres, kontrakt i dodatkowe informacje o usłudze.
W poniższym przykładzie pokazano, jak wykonać operację znajdowania w kodzie.
// 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)