WCF 클라이언트 애플리케이션을 작성할 때 호출하는 서비스의 엔드포인트 주소를 알아야 합니다. 대부분의 경우 서비스의 엔드포인트 주소를 미리 알 수 없거나 시간이 지남에 따라 서비스의 주소가 변경됩니다. 검색 클라이언트 채널을 사용하면 WCF 클라이언트 애플리케이션을 작성하고, 호출하려는 서비스를 설명하고, 클라이언트 채널이 프로브 요청을 자동으로 보냅니다. 서비스가 응답하면 검색 클라이언트 채널은 프로브 응답에서 서비스에 대한 엔드포인트 주소를 검색하고 이를 사용하여 서비스를 호출합니다.
검색 클라이언트 채널 사용
검색 클라이언트 채널을 사용하려면 클라이언트 채널 스택에 인스턴스를 DiscoveryClientBindingElement 추가합니다. 대신, DynamicEndpoint을 사용할 수 있으며, DiscoveryClientBindingElement은 아직 바인딩에 없는 경우 자동으로 추가됩니다.
주의
클라이언트 채널 스택에서 DiscoveryClientBindingElement 최상위 요소인 것이 좋습니다. 모든 바인딩 요소는 DiscoveryClientBindingElement 위에 추가될 때, 드러나거나 생성된 채널이 엔드포인트 주소나 ChannelFactory 주소(메서드에 전달된 Via)를 사용하지 않아야 합니다. 이들이 올바른 주소를 포함하지 않을 가능성이 있으므로.
클래스에는 DiscoveryClientBindingElement 다음 두 개의 공용 속성이 포함됩니다.
FindCriteria호출하려는 서비스를 설명하는 데 사용됩니다.
DiscoveryEndpointProvider 검색 메시지를 보낼 검색 엔드포인트를 지정합니다.
이 FindCriteria 속성을 사용하면 검색할 서비스 계약, 필요한 범위 URI 및 채널을 열려고 시도하는 최대 시간을 지정할 수 있습니다. 계약 형식은 생성자를 FindCriteria호출하여 지정됩니다. 범위 URI를 속성에 Scopes 추가할 수 있습니다. 이 MaxResults 속성을 사용하면 클라이언트가 연결하려고 하는 최대 결과 수를 지정할 수 있습니다. 프로브 응답이 수신되면 클라이언트는 프로브 응답의 엔드포인트 주소를 사용하여 채널을 열려고 시도합니다. 예외가 발생하면 클라이언트는 다음 프로브 응답으로 이동하여 필요한 경우 더 많은 응답이 수신될 때까지 기다립니다. 채널이 성공적으로 열리거나 최대 결과 수에 도달할 때까지 이 작업을 계속합니다. 이러한 설정에 대한 자세한 내용은 다음을 참조하세요 FindCriteria.
이 DiscoveryEndpointProvider 속성을 사용하면 사용할 검색 엔드포인트를 지정할 수 있습니다. 일반적으로 이것은 UdpDiscoveryEndpoint이지만, 다른 유효한 엔드포인트가 될 수도 있습니다.
서비스와 통신하는 데 사용할 바인딩을 만들 때는 서비스와 정확히 동일한 바인딩을 사용해야 합니다. 유일한 차이점은 클라이언트 바인딩 DiscoveryClientBindingElement 이 스택의 맨 위에 있다는 것입니다. 서비스에서 시스템 제공 바인딩 중 하나를 사용하는 경우 새 CustomBinding 바인딩을 만들고 시스템 제공 바인딩 CustomBinding 을 생성자에 전달합니다.
DiscoveryClientBindingElement를 추가하려면 Insert 속성에서 Elements을 호출하십시오.
바인딩에 DiscoveryClientBindingElement 추가하고 구성한 후에는 WCF 클라이언트 클래스의 인스턴스를 만들고, 열고, 해당 메서드를 호출할 수 있습니다. 다음 예제에서는 검색 클라이언트 채널을 사용하여 ICalculator 클래스를 구현하고 그 Add 메서드를 호출하는 WCF 서비스를 검색합니다. (이 클래스는 시작 WCF 자습서에서 사용됩니다.)
// Create the DiscoveryClientBindingElement
DiscoveryClientBindingElement bindingElement = new DiscoveryClientBindingElement();
// Search for a service that implements the ICalculator interface, attempting to open
// the channel a maximum of 2 times
bindingElement.FindCriteria = new FindCriteria(typeof(ICalculator)) { MaxResults = 2 };
// Use the UdpDiscoveryEndpoint
bindingElement.DiscoveryEndpoint = new UdpDiscoveryEndpoint();
// The service uses the BasicHttpBinding, so use that and insert the DiscoveryClientBindingElement at the
// top of the stack
CustomBinding binding = new CustomBinding(new BasicHttpBinding());
binding.Elements.Insert(0,bindingElement);
try
{
// Create the WCF client and call a method
CalculatorClient client = new CalculatorClient(binding, new EndpointAddress("http://schemas.microsoft.com/dynamic"));
client.Open();
client.Add(1, 1);
}
catch (EndpointNotFoundException ex)
{
Console.WriteLine("An exception occurred: " + ex.Message);
}
보안 및 검색 클라이언트 채널
검색 클라이언트 채널을 사용하는 경우 두 개의 엔드포인트가 지정됩니다. 하나는 일반적으로 UdpDiscoveryEndpoint검색 메시지에 사용되고 다른 하나는 애플리케이션 엔드포인트입니다. 보안 서비스를 구현할 때는 두 엔드포인트를 모두 보호하기 위해 주의해야 합니다. 보안에 대한 자세한 내용은 서비스 및 클라이언트 보안을 참조하세요.