다음을 통해 공유


찾기 및 FindCriteria

찾기 작업은 하나 이상의 서비스를 검색하는 클라이언트에 의해 시작되며 검색 작업의 주요 동작 중 하나입니다. 찾기를 수행하면 네트워크를 통해 WS-Discovery Probe 메시지가 보내집니다. 지정된 조건과 일치하는 서비스는 WS-Discovery ProbeMatch 메시지를 사용하여 응답합니다. 검색 메시지에 대한 자세한 내용은 WS-Discovery 사양을 참조하세요.

DiscoveryClient

DiscoveryClient 클래스는 찾기 작업을 수행하는 메커니즘을 제공하고 검색 클라이언트 작업을 손쉽게 수행할 수 있게 합니다. 여기에는 동기(블로킹) 찾기를 수행하는 Find 메서드와 비동기(비블로킹) 찾기를 시작하는 FindAsync 메서드가 포함됩니다. 두 메서드는 모두 FindCriteria 매개 변수를 사용하며 FindResponse 개체를 통해 결과를 사용자에게 제공합니다.

FindCriteria

FindCriteria에는 찾을 서비스를 지정하는 검색 조건 및 검색 지속 기간을 지정하는 찾기 종료 조건으로 그룹화할 수 있는 여러 속성이 있습니다. FindCriteria에는 여러 개의 검색 조건이 포함되어 있을 수 있습니다. 기본적으로 서비스는 이러한 모든 검색 조건과 일치해야 합니다. 그렇지 않으면 스스로를 일치하는 서비스로 간주하지 않습니다. 일부 조건만 일치하는 서비스를 찾으려면 서비스에 대해 사용자 지정 찾기 논리를 구현하거나 여러 쿼리를 사용하면 됩니다.

검색 조건은 다음과 같습니다.

  • ContractTypeNameElement - 선택적 요소로서, 검색할 서비스의 계약 이름이거나 서비스를 검색할 때 일반적으로 사용되는 조건입니다. 둘 이상의 계약 이름이 지정되면 모든 계약과 일치하는 서비스 엔드포인트만 응답합니다. WCF에서 엔드포인트는 하나의 계약만 지원할 수 있습니다.

  • ScopeElement - 선택적 요소로서, 개별 서비스 엔드포인트를 분류하는 데 사용되는 절대 URI입니다. 여러 엔드포인트가 동일한 계약을 노출하는 상태에서 엔드포인트의 하위 집합을 검색하려는 경우 이 조건을 사용할 수 있습니다. 둘 이상의 범위가 지정되면 모든 범위와 일치하는 서비스 엔드포인트만 응답합니다.

  • ScopeMatchBy - Probe 메시지의 범위와 엔드포인트의 범위를 일치시키는 동안 사용할 일치 알고리즘을 지정합니다. 다음과 같은 다섯 가지 범위 일치 규칙이 지원됩니다.

    범위 일치 규칙이 지정되지 않은 경우 ScopeMatchByPrefix가 사용됩니다.

종료 조건은 다음과 같습니다.

  1. Duration - 네트워크에서 서비스의 응답을 기다리는 최대 시간입니다. 기본 시간은 20초입니다.

  2. MaxResults - 기다릴 응답의 최대 수입니다. Duration이 경과하기 전에 MaxResults 회신이 수신되면 찾기 작업이 종료됩니다.

FindResponse

FindResponse에는 네트워크에서 일치하는 서비스가 보낸 응답을 포함하는 Endpoints 컬렉션 속성이 있습니다. 응답하는 서비스가 없으면 컬렉션이 비어 있습니다. 하나 이상의 서비스가 응답하면 서비스 주소 및 계약을 비롯한 서비스에 대한 일부 추가 정보가 포함된 EndpointDiscoveryMetadata 개체에 각 응답이 저장됩니다.

다음 예제에서는 코드에서 찾기 작업을 수행하는 방법을 보여 줍니다.

// 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)

참고 항목