자습서: 기본 Windows Communication Foundation 서비스 호스트 및 실행

이 자습서에서는 기본 WCF(Windows Communication Foundation) 애플리케이션을 만드는 데 필요한 다섯 가지 작업 중 세 번째 작업에 대해 설명합니다. 자습서에 대한 개요는 자습서: Windows Communication Foundation 애플리케이션 시작를 참조하세요.

WCF 애플리케이션을 만드는 다음 작업은 콘솔 애플리케이션에서 WCF 서비스를 호스팅하는 것입니다. WCF 서비스는 하나 이상의 ‘엔드포인트’를 노출하며 각 엔드포인트는 하나 이상의 서비스 작업을 노출합니다. 서비스 엔드포인트는 다음 정보를 지정합니다.

  • 서비스를 찾을 수 있는 주소
  • 클라이언트가 서비스와 통신하는 방법을 설명하는 정보를 포함하는 바인딩
  • 서비스가 클라이언트에 제공하는 기능을 정의하는 계약

이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • WCF 서비스를 호스팅하기 위한 콘솔 앱 프로젝트를 만들고 구성합니다.
  • WCF 서비스를 호스팅하는 코드를 추가합니다.
  • 구성 파일을 업데이트합니다.
  • WCF 서비스를 시작하고 실행 중인지 확인합니다.

서비스 호스팅을 위한 콘솔 앱 프로젝트 만들기 및 구성

  1. 다음과 같이 Visual Studio에서 콘솔 앱 프로젝트를 만듭니다.

    1. 파일 메뉴에서 열기>프로젝트/솔루션을 선택하고 이전에 만든 GettingStarted 솔루션(GettingStarted.sln)으로 이동합니다. 열기를 선택합니다.

    2. 보기 메뉴에서 솔루션 탐색기를 선택합니다.

    3. 솔루션 탐색기 창에서 GettingStarted 솔루션(최상위 노드)을 선택한 다음, 바로 가기 메뉴에서 추가>새 프로젝트를 선택합니다.

    4. 새 프로젝트 창 왼쪽에 있는 Visual C# 또는 Visual Basic 아래에서 Windows 데스크톱 범주를 선택합니다.

    5. 콘솔 앱(.NET Framework) 템플릿을 선택하고 이름으로 GettingStartedHost를 입력합니다. 확인을 선택합니다.

  2. GettingStartedHost 프로젝트의 참조를 GettingStartedLib 프로젝트에 추가합니다.

    1. 솔루션 탐색기 창에서 GettingStartedHost 프로젝트 아래의 참조 폴더를 선택한 다음, 바로 가기 메뉴에서 참조 추가를 선택합니다.

    2. 참조 추가 대화 상자에서 창 왼쪽에 있는 프로젝트 아래에서 솔루션을 선택합니다.

    3. 창의 가운데 섹션에서 GettingStartedLib를 선택한 다음, 확인을 선택합니다.

      이 작업을 수행하면 GettingStartedLib 프로젝트에 정의된 형식을 GettingStartedHost 프로젝트에서 사용할 수 있습니다.

  3. GettingStartedHost 프로젝트의 참조를 System.ServiceModel 어셈블리에 추가합니다.

    1. 솔루션 탐색기 창에서 GettingStartedHost 프로젝트 아래의 참조 폴더를 선택한 다음, 바로 가기 메뉴에서 참조 추가를 선택합니다.

    2. 참조 추가 창의 창 왼쪽에 있는 어셈블리 아래에서 프레임워크를 선택합니다.

    3. System.ServiceModel을 선택한 다음, 확인을 선택합니다.

    4. 파일>모두 저장을 선택하여 솔루션을 저장합니다.

서비스를 호스팅하는 코드 추가

서비스를 호스팅하려면 다음 단계를 수행하는 코드를 추가합니다.

  1. 기본 주소에 대한 URI를 만듭니다.
  2. 서비스를 호스팅하기 위한 클래스 인스턴스를 만듭니다.
  3. 서비스 엔드포인트를 만듭니다.
  4. 메타데이터 교환을 사용하도록 설정합니다.
  5. 들어오는 메시지를 수신 대기할 서비스 호스트를 엽니다.

코드를 다음과 같이 변경합니다.

  1. GettingStartedHost 프로젝트에서 Program.cs 또는 Module1.vb 파일을 열고 해당 코드를 다음 코드로 바꿉니다.

    using System;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using GettingStartedLib;
    
    namespace GettingStartedHost
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Step 1: Create a URI to serve as the base address.
                Uri baseAddress = new Uri("http://localhost:8000/GettingStarted/");
    
                // Step 2: Create a ServiceHost instance.
                ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
    
                try
                {
                    // Step 3: Add a service endpoint.
                    selfHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService");
    
                    // Step 4: Enable metadata exchange.
                    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                    smb.HttpGetEnabled = true;
                    selfHost.Description.Behaviors.Add(smb);
    
                    // Step 5: Start the service.
                    selfHost.Open();
                    Console.WriteLine("The service is ready.");
    
                    // Close the ServiceHost to stop the service.
                    Console.WriteLine("Press <Enter> to terminate the service.");
                    Console.WriteLine();
                    Console.ReadLine();
                    selfHost.Close();
                }
                catch (CommunicationException ce)
                {
                    Console.WriteLine("An exception occurred: {0}", ce.Message);
                    selfHost.Abort();
                }
            }
        }
    }
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    Imports GettingStartedLib.GettingStartedLib
    
    Module Service
    
        Class Program
            Shared Sub Main()
                ' Step 1: Create a URI to serve as the base address.
                Dim baseAddress As New Uri("http://localhost:8000/GettingStarted/")
    
                ' Step 2: Create a ServiceHost instance.
                Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress)
               Try
    
                    ' Step 3: Add a service endpoint.
                    selfHost.AddServiceEndpoint( _
                        GetType(ICalculator), _
                        New WSHttpBinding(), _
                        "CalculatorService")
    
                    ' Step 4: Enable metadata exchange.
                    Dim smb As New ServiceMetadataBehavior()
                    smb.HttpGetEnabled = True
                    selfHost.Description.Behaviors.Add(smb)
    
                    ' Step 5: Start the service.
                    selfHost.Open()
                    Console.WriteLine("The service is ready.")
    
                    ' Close the ServiceHost to stop the service.
                    Console.WriteLine("Press <Enter> to terminate the service.")
                    Console.WriteLine()
                    Console.ReadLine()
                    selfHost.Close()
    
                Catch ce As CommunicationException
                    Console.WriteLine("An exception occurred: {0}", ce.Message)
                    selfHost.Abort()
                End Try
            End Sub
        End Class
    
    End Module
    

    이 코드의 작동 방식에 대한 내용은 서비스 호스팅 프로그램 단계를 참조하세요.

  2. 프로젝트 속성을 업데이트합니다.

    1. 솔루션 탐색기 창에서 GettingStartedHost 폴더를 선택한 다음, 바로 가기 메뉴에서 속성을 선택합니다.

    2. GettingStartedHost 속성 페이지에서 애플리케이션 탭을 선택합니다.

      • C# 프로젝트의 경우 시작 개체 목록에서 GettingStartedHost.Program을 선택합니다.

      • Visual Basic 프로젝트의 경우 시작 개체> 목록에서 Service.Program을 선택합니다.

    3. 파일 메뉴에서 모두 저장을 선택합니다.

서비스가 작동하는지 확인

  1. 솔루션을 빌드한 다음, Visual Studio 내에서 GettingStartedHost 콘솔 애플리케이션을 실행합니다.

    이 서비스는 관리자 권한으로 실행해야 합니다. 관리자 권한으로 Visual Studio를 열었으므로 visual Studio에서 GettingStartedHost를 실행하면 애플리케이션도 관리자 권한으로 실행됩니다. 또는 관리자 권한으로 새 명령 프롬프트를 열고(바로 가기 메뉴에서 더 보기>관리자 권한으로 실행 선택) 그 안에서 GettingStartedHost.exe를 실행할 수 있습니다.

  2. 웹 브라우저를 열고 http://localhost:8000/GettingStarted/의 서비스의 페이지로 이동합니다.

    참고 항목

    이러한 서비스에는 수신 대기를 위해 시스템에 HTTP 주소를 등록할 적절한 권한이 있어야 합니다. 관리자 계정에는 이 권한이 있지만, 관리자 이외의 계정에는 HTTP 네임스페이스에 대한 권한을 부여해야 합니다. 네임스페이스 예약을 구성하는 방법에 대한 자세한 내용은 HTTP 및 HTTPS 구성을 참조하세요.

서비스 호스팅 프로그램 단계

서비스를 호스팅하기 위해 추가한 코드의 단계는 다음과 같습니다.

  • 1단계: 서비스의 기본 주소를 보유할 Uri 클래스의 인스턴스를 만듭니다. 기본 주소가 포함된 URL에는 서비스를 식별하는 선택적 URI가 있습니다. 기본 주소는 <transport>://<machine-name or domain><:optional port #>/<optional URI segment>와 같이 형식이 지정됩니다. 계산기 서비스의 기본 주소는 HTTP 전송, localhost, 포트 8000 및 URI 세그먼트인 GettingStarted를 사용합니다.

  • 2단계: 서비스를 호스팅하는 데 사용하는 ServiceHost 클래스의 인스턴스를 만듭니다. 생성자는 서비스 계약을 구현하는 클래스 형식과 서비스의 기본 주소, 두 가지 매개 변수를 사용합니다.

  • 3단계: ServiceEndpoint 인스턴스를 만듭니다. 서비스 엔드포인트는 주소, 바인딩 및 서비스 계약으로 구성되어 있습니다. ServiceEndpoint 생성자는 서비스 계약 인터페이스 형식, 바인딩 및 주소로 구성됩니다. 서비스 계약은 사용자가 정의한 ICalculator이며 서비스 형식에 구현합니다. 이 샘플의 바인딩은 기본 제공 바인딩이고 WS-* 사양을 준수하는 엔드포인트에 연결되는 WSHttpBinding입니다. WCF 바인딩에 대한 자세한 내용은 WCF 바인딩 개요를 참조하세요. 엔드포인트를 식별하기 위해 주소를 기본 주소에 추가합니다. 이 코드는 주소를 CalculatorService로 지정하고 엔드포인트의 정규화된 주소를 http://localhost:8000/GettingStarted/CalculatorService로 지정합니다.

    Important

    .NET Framework 버전 4 이상에서는 서비스 엔드포인트를 추가하는 것이 선택 사항입니다. 이러한 버전에서 코드 또는 구성을 추가하지 않으면 WCF가 기본 주소의 각 결합에 기본 엔드포인트 하나씩을 추가하고 서비스에서 구현한 계약을 추가합니다. 기본 엔드포인트에 대한 자세한 내용은 엔드포인트 주소 지정을 참조하세요. 기본 엔드포인트, 바인딩 및 동작에 대한 자세한 내용은 단순화된 구성WCF 서비스를 위한 단순화된 구성을 참조하세요.

  • 4단계: 메타데이터 교환을 사용하도록 설정합니다. 클라이언트는 메타데이터 교환을 사용하여 서비스 작업을 호출하기 위한 프록시를 생성합니다. 메타데이터 교환을 사용하도록 설정하려면 ServiceMetadataBehavior 인스턴스를 만들고 해당 HttpGetEnabled 속성을 true로 설정한 다음, ServiceMetadataBehavior 개체를 ServiceHost 인스턴스의 Behaviors 컬렉션에 추가합니다.

  • 5단계: ServiceHost를 열어 들어오는 메시지를 수신합니다. 애플리케이션은 사용자가 Enter 키를 누를 때까지 기다립니다. 애플리케이션이 ServiceHost를 인스턴스화한 후 try/catch 블록을 실행합니다. ServiceHost에서 throw된 예외를 안전하게 catch하는 방법에 대한 자세한 내용은 닫기 및 중단을 사용하여 WCF 클라이언트 리소스 해제를 참조하세요.

Important

WCF 서비스 라이브러리를 추가하면 서비스 호스트를 시작하여 디버그하는 경우 Visual Studio에서 호스팅합니다. 충돌을 방지하기 위해 Visual Studio에서 WCF 서비스 라이브러리를 호스팅하지 못하도록 할 수 있습니다.

  1. 솔루션 탐색기에서 GettingStartedLib 프로젝트를 선택하고 바로 가기 메뉴에서 속성을 선택합니다.
  2. WCF 옵션을 선택하고 동일한 솔루션에서 다른 프로젝트를 디버깅할 때 WCF 서비스 호스트 시작을 선택 취소합니다.

다음 단계

이 자습서에서는 다음 작업 방법을 알아보았습니다.

  • WCF 서비스를 호스팅하기 위한 콘솔 앱 프로젝트를 만들고 구성합니다.
  • WCF 서비스를 호스팅하는 코드를 추가합니다.
  • 구성 파일을 업데이트합니다.
  • WCF 서비스를 시작하고 실행 중인지 확인합니다.

다음 자습서로 이동하여 WCF 클라이언트를 만드는 방법을 알아봅니다.