다음을 통해 공유


WCF 검색 개요

검색 API는 WS-Discovery 프로토콜을 사용하여 웹 서비스의 동적 게시 및 검색을 위한 통합 프로그래밍 모델을 제공합니다. 이러한 API를 통해 서비스는 자체 및 클라이언트를 게시하여 게시된 서비스를 찾을 수 있습니다. 서비스를 검색할 수 있게 되면 서비스는 알림 메시지를 보내고 검색 요청을 수신 대기하고 응답할 수 있습니다. 검색 가능한 서비스는 Hello 메시지를 보내 네트워크에 도착을 알리고 Bye 메시지를 보내 네트워크에서 출발을 알릴 수 있습니다. 서비스를 찾기 위해 클라이언트는 네트워크의 서비스 계약 유형, 키워드 및 범위와 같은 특정 조건이 포함된 요청을 보냅니 Probe 다. 서비스는 요청을 수신 Probe 하고 조건과 일치하는지 여부를 결정합니다. 서비스가 일치하는 경우 서비스에 문의하는 데 필요한 정보를 사용하여 클라이언트에 메시지를 다시 전송 ProbeMatch 하여 응답합니다. 클라이언트는 엔드포인트 주소가 변경되었을 가능성이 있는 서비스를 찾을 수 있는 Resolve 요청을 보낼 수도 있습니다. 일치하는 서비스는 클라이언트에 Resolve 메시지를 다시 전송 ResolveMatch 하여 요청에 응답합니다.

임시 및 관리 모드

검색 API는 관리 모드와 임시 모드의 두 가지 모드를 지원합니다. 관리 모드에는 사용 가능한 서비스에 대한 정보를 유지하는 검색 프록시라는 중앙 집중식 서버가 있습니다. 검색 프록시는 다양한 방법으로 서비스에 대한 정보로 채울 수 있습니다. 예를 들어 서비스는 검색 프록시를 시작하는 동안 알림 메시지를 보내거나 프록시가 데이터베이스 또는 구성 파일에서 데이터를 읽어 사용할 수 있는 서비스를 결정할 수 있습니다. 검색 프록시를 채우는 방법은 개발자에게 전적으로 달려 있습니다. 클라이언트는 검색 프록시를 사용하여 사용 가능한 서비스에 대한 정보를 검색합니다. 클라이언트가 서비스를 검색할 때 검색 프록시에 메시지를 보내고 Probe 프록시는 클라이언트가 검색하는 서비스와 일치하는지 여부를 확인합니다. 일치하는 항목이 있는 경우 검색 프록시는 클라이언트에 ProbeMatch 응답을 다시 보냅니다. 그런 다음 클라이언트는 프록시에서 반환된 서비스 정보를 사용하여 서비스에 직접 연결할 수 있습니다. 관리 모드의 주요 원칙은 검색 요청이 유니캐스트 방식으로 검색 프록시인 한 기관으로 전송된다는 것입니다. .NET Framework에는 사용자 고유의 프록시를 빌드할 수 있는 주요 구성 요소가 포함되어 있습니다. 클라이언트와 서비스는 여러 방법으로 프록시를 찾을 수 있습니다.

  • 프록시는 임시 메시지에 응답할 수 있습니다.

  • 프록시는 시작하는 동안 알림 메시지를 보낼 수 있습니다.

  • 잘 알려진 특정 엔드포인트를 찾기 위해 클라이언트 및 서비스를 작성할 수 있습니다.

임시 모드에는 중앙 집중식 서버가 없습니다. 서비스 알림 및 클라이언트 요청과 같은 모든 검색 메시지는 멀티캐스트 방식으로 전송됩니다. 기본적으로 .NET Framework는 UDP 프로토콜을 통해 임시 검색을 지원합니다. 예를 들어 서비스가 시작 시 Hello 공지를 보내도록 구성된 경우 UDP 프로토콜을 사용하여 잘 알려진 멀티캐스트 주소를 통해 전송합니다. 클라이언트는 이러한 공지 사항을 적극적으로 듣고 그에 따라 처리해야 합니다. 클라이언트가 서비스에 대한 메시지를 보내 Probe 면 멀티캐스트 프로토콜을 사용하여 네트워크를 통해 전송됩니다. 요청을 수신하는 각 서비스는 메시지의 조건과 일치하는지 여부를 결정하고, 서비스가 메시지에 지정된 조건 Probe 과 일치하는 경우 메시지와 함께 ProbeMatch 클라이언트에 Probe 직접 응답합니다.

WCF 검색 사용의 이점

WCF 검색은 WS-Discovery 프로토콜을 사용하여 구현되므로 WS-Discovery 구현하는 다른 클라이언트, 서비스 및 프록시와도 상호 운용할 수 있습니다. WCF 검색은 기존 WCF API를 기반으로 하므로 기존 서비스 및 클라이언트에 검색 기능을 쉽게 추가할 수 있습니다. 애플리케이션 구성 설정을 통해 서비스 검색 기능을 쉽게 추가할 수 있습니다. 또한 WCF 검색은 피어 넷, 명명 오버레이 및 HTTP와 같은 다른 전송에 대해 검색 프로토콜 사용을 지원합니다. WCF 검색은 검색 프록시가 사용되는 관리되는 작업 모드를 지원합니다. 이렇게 하면 메시지가 전체 네트워크에 멀티캐스트 메시지를 보내는 대신 검색 프록시로 직접 전송되기 때문에 네트워크 트래픽을 줄일 수 있습니다. 또한 WCF 검색을 사용하면 웹 서비스를 사용할 때 유연성이 높아질 수 있습니다. 예를 들어 클라이언트 또는 서비스를 다시 구성하지 않고도 서비스의 주소를 변경할 수 있습니다. 클라이언트가 서비스에 액세스해야 하는 경우, Probe 메시지를 Find 요청을 통해 발급하고 서비스가 현재 주소로 응답할 것으로 기대할 수 있습니다. WCF 검색을 사용하면 클라이언트가 계약 유형, 바인딩 요소, 네임스페이스, 범위 및 키워드 또는 버전 번호를 비롯한 다양한 조건에 따라 서비스를 검색할 수 있습니다. WCF 검색을 사용하면 런타임 및 디자인 타임 검색이 가능합니다. 애플리케이션에 검색을 추가하여 내결함성 및 자동 구성과 같은 다른 시나리오를 사용하도록 설정할 수 있습니다.

서비스 게시

서비스를 검색할 수 ServiceDiscoveryBehavior 있도록 하려면 서비스 호스트에 추가해야 하며 검색 엔드포인트를 추가하여 검색 메시지를 수신 대기할 위치를 지정해야 합니다. 다음 코드 예제에서는 자체 호스팅 서비스를 검색할 수 있도록 수정할 수 있는 방법을 보여줍니다.

Uri baseAddress = new Uri($"http://{System.Net.Dns.GetHostName()}:8000/discovery/scenarios/calculatorservice/{Guid.NewGuid().ToString()}/");

// Create a ServiceHost for the CalculatorService type.
using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress))
{
    // Add calculator endpoint
    serviceHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), string.Empty);

    // ** DISCOVERY ** //
    // Make the service discoverable by adding the discovery behavior
    serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());

    // ** DISCOVERY ** //
    // Add the discovery endpoint that specifies where to publish the services
    serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());

    // Open the ServiceHost to create listeners and start listening for messages.
    serviceHost.Open();

    // The service can now be accessed.
    Console.WriteLine("Press <ENTER> to terminate service.");
    Console.ReadLine();
}

ServiceDiscoveryBehavior 서비스를 검색하려면 서비스 설명에 인스턴스를 추가해야 합니다. DiscoveryEndpoint 검색 요청을 수신 대기할 위치를 서비스에 알리려면 서비스 호스트에 인스턴스를 추가해야 합니다. 이 예제에서는 UdpDiscoveryEndpoint로부터 파생된 DiscoveryEndpoint이 추가되어, 서비스가 UDP 멀티캐스트 전송을 통해 검색 요청을 수신하도록 지정합니다. UdpDiscoveryEndpoint 모든 메시지가 멀티캐스트 방식으로 전송되기 때문에 임시 검색에 사용됩니다.

알림

기본적으로 서비스 게시는 알림 메시지를 보내지 않습니다. 알림 메시지를 보내도록 서비스를 구성해야 합니다. 이렇게 하면 서비스 작성자가 검색 메시지 수신 대기와 별도로 서비스를 알려줄 수 있으므로 추가 유연성을 제공합니다. 서비스 공지 사항을 검색 프록시 또는 기타 서비스 레지스트리에 등록하기 위한 메커니즘으로 사용할 수도 있습니다. 다음 코드는 UDP 바인딩을 통해 알림 메시지를 보내도록 서비스를 구성하는 방법을 보여줍니다.

Uri baseAddress = new Uri($"http://{System.Net.Dns.GetHostName()}:8000/discovery/scenarios/calculatorservice/{Guid.NewGuid().ToString()}/");

// Create a ServiceHost for the CalculatorService type.
using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress))
{
    // Add calculator endpoint
    serviceHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), string.Empty);

    // ** DISCOVERY ** //
    // Make the service discoverable by adding the discovery behavior
    ServiceDiscoveryBehavior discoveryBehavior = new ServiceDiscoveryBehavior();
    serviceHost.Description.Behaviors.Add(discoveryBehavior);

    // Send announcements on UDP multicast transport
    discoveryBehavior.AnnouncementEndpoints.Add(
      new UdpAnnouncementEndpoint());

    // ** DISCOVERY ** //
    // Add the discovery endpoint that specifies where to publish the services
    serviceHost.Description.Endpoints.Add(new UdpDiscoveryEndpoint());

    // Open the ServiceHost to create listeners and start listening for messages.
    serviceHost.Open();

    // The service can now be accessed.
    Console.WriteLine("Press <ENTER> to terminate service.");
    Console.ReadLine();
}

서비스 검색

클라이언트 애플리케이션은 클래스를 DiscoveryClient 사용하여 서비스를 찾을 수 있습니다. 개발자는 메시지를 DiscoveryClient 또는 Probe에 보낼 위치를 지정하는 검색 엔드포인트를 전달하는 클래스 Resolve의 인스턴스를 생성합니다. 그런 다음 클라이언트는 Find 인스턴스 내에서 검색 조건을 지정하는 FindCriteria 를 호출합니다. 일치하는 서비스가 발견되면, FindEndpointDiscoveryMetadata 컬렉션을 반환합니다. 다음 코드는 Find 메서드를 호출한 후, 검색된 서비스에 연결하는 방법을 보여줍니다.

class Client
{
    static EndpointAddress serviceAddress;
  
    static void Main()
    {  
        if (FindService())
        {
            InvokeService();
        }
    }  
  
    // ** DISCOVERY ** //  
    static bool FindService()  
    {  
        Console.WriteLine("\nFinding Calculator Service ..");  
        DiscoveryClient discoveryClient =
            new DiscoveryClient(new UdpDiscoveryEndpoint());  
  
        Collection<EndpointDiscoveryMetadata> calculatorServices =
            (Collection<EndpointDiscoveryMetadata>)discoveryClient.Find(new FindCriteria(typeof(ICalculator))).Endpoints;  
  
        discoveryClient.Close();  
  
        if (calculatorServices.Count == 0)  
        {  
            Console.WriteLine("\nNo services are found.");  
            return false;  
        }  
        else  
        {  
            serviceAddress = calculatorServices[0].Address;  
            return true;  
        }  
    }  
  
    static void InvokeService()  
    {  
        Console.WriteLine("\nInvoking Calculator Service at {0}\n", serviceAddress);  
  
        // Create a client  
        CalculatorClient client = new CalculatorClient();  
        client.Endpoint.Address = serviceAddress;  
        client.Add(10,3);  
    }
}  

검색 및 메시지 수준 보안

메시지 수준 보안을 사용할 때 서비스 검색 엔드포인트에는 EndpointIdentity을, 클라이언트 검색 엔드포인트에는 해당하는 EndpointIdentity를 지정해야 합니다. 메시지 수준 보안에 대한 자세한 내용은 메시지 보안을 참조하세요.

검색 및 웹 호스팅 서비스

WCF 서비스를 검색하려면 실행 중이어야 합니다. IIS 또는 WAS에서 호스트되는 WCF 서비스는 IIS/WAS가 서비스에 바인딩된 메시지를 받을 때까지 실행되지 않으므로 기본적으로 검색할 수 없습니다. Web-Hosted 서비스를 검색할 수 있도록 하는 두 가지 옵션이 있습니다.

  1. Windows Server AppFabric 자동 시작 기능 사용

  2. 검색 프록시를 사용하여 서비스를 대신하여 통신

Windows Server AppFabric에는 메시지를 받기 전에 서비스를 시작할 수 있는 자동 시작 기능이 있습니다. 이 자동 시작 집합을 사용하면 IIS/WAS 호스팅 서비스를 검색할 수 있도록 구성할 수 있습니다. 자동 시작 기능에 대한 자세한 내용은 Windows Server AppFabric 자동 시작 기능을 참조하세요. 자동 시작 기능을 켜는 것 외에 검색을 위해 서비스를 구성해야 합니다. 자세한 내용은 방법: 프로그래밍 방식으로 WCF 서비스 및 클라이언트에 검색 기능 추가, 구성 파일에서 검색 구성하기를 참조하세요.

검색 프록시는 서비스가 실행되고 있지 않을 때 WCF 서비스를 대신하여 통신하는 데 사용할 수 있습니다. 프록시는 프로브를 수신 대기하거나 메시지를 확인하고 클라이언트에 응답할 수 있습니다. 그런 다음 클라이언트는 서비스에 직접 메시지를 보낼 수 있습니다. 클라이언트가 서비스에 메시지를 보내면 메시지에 응답하도록 인스턴스화됩니다. 검색 프록시 구현에 대한 자세한 내용은 검색 프록시 구현을 참조하세요.

비고

WCF 검색이 제대로 작동하려면 모든 NIC(네트워크 인터페이스 컨트롤러)에 IP 주소가 1개만 있어야 합니다.