방법: 관리되는 응용 프로그램에서 WCF 서비스 호스팅How to: Host a WCF Service in a Managed Application

관리되는 응용 프로그램 내에서 서비스를 호스팅하려면 관리되는 응용 프로그램 코드 내에 서비스에 대한 코드를 포함하고, 코드에서 명령적으로, 구성을 통해 선언적으로 또는 기본 끝점을 사용해 서비스에 대한 끝점을 정의한 다음 ServiceHost의 인스턴스를 만듭니다.To host a service inside a managed application, embed the code for the service inside the managed application code, define an endpoint for the service either imperatively in code, declaratively through configuration, or using default endpoints, and then create an instance of ServiceHost.

메시지 받기를 시작하려면 Open에서 ServiceHost을 호출합니다.To start receiving messages, call Open on ServiceHost. 이렇게 하면 서비스에 대한 수신기가 만들어지고 열립니다.This creates and opens the listener for the service. 관리되는 응용 프로그램이 호스팅 작업을 직접 수행하므로 이런 방식으로 서비스를 호스팅하는 것을 "자체 호스팅"이라고 합니다.Hosting a service in this way is often referred to as "self-hosting" because the managed application is doing the hosting work itself. 서비스를 닫으려면 CommunicationObject.Close에서 ServiceHost를 호출합니다.To close the service, call CommunicationObject.Close on ServiceHost.

서비스는 관리되는 Windows 서비스, IIS(인터넷 정보 서비스) 또는 WAS(Windows Process Activation Service)에서 호스팅될 수도 있습니다.A service can also be hosted in a managed Windows service, in Internet Information Services (IIS), or in Windows Process Activation Service (WAS). 추가 정보For more information about호스팅 서비스에 대 한 옵션, 참조 호스팅 서비스합니다. hosting options for a service, see Hosting Services.

관리되는 응용 프로그램에서 서비스를 호스팅할 경우 최소한의 배포 인프라를 필요로 하기 때문에 가장 유연한 옵션입니다.Hosting a service in a managed application is the most flexible option because it requires the least infrastructure to deploy. 추가 정보For more information about관리 되는 응용 프로그램에서 서비스를 호스팅, 참조 관리 되는 응용 프로그램에서 호스팅합니다. hosting services in managed applications, see Hosting in a Managed Application.

다음 절차에서는 콘솔 응용 프로그램에서 자체 호스팅된 서비스를 구현하는 방법을 보여 줍니다.The following procedure demonstrates how to implement a self-hosted service in a console application.

자체 호스팅된 서비스를 만들려면To create a self-hosted service

  1. 열기 Visual Studio 2012Visual Studio 2012 선택 새로, 프로젝트... 에서 파일 메뉴.Open Visual Studio 2012Visual Studio 2012 and select New, Project... from the File menu.

  2. 설치 된 템플릿 목록에서 Visual C#, Windows 또는 Visual Basic, Windows.In the Installed Templates list, select Visual C#, Windows or Visual Basic, Windows. 에 따라 프로그램 Visual Studio 2012Visual Studio 2012 설정, 하나 또는 둘 다 있을 수 있습니다는 다른 언어 에서 노드는 설치 된 템플릿 목록입니다.Depending on your Visual Studio 2012Visual Studio 2012 settings, one or both of these may be under the Other Languages node in the Installed Templates list.

  3. 선택 콘솔 응용 프로그램 에서 Windows 목록입니다.Select Console Application from the Windows list. 형식 SelfHost이름 상자 한 클릭 확인합니다.Type SelfHost in the Name box and click OK.

  4. 마우스 오른쪽 단추로 클릭 SelfHost솔루션 탐색기 선택 참조 추가... . 선택 System.ServiceModel 에서 .NET 탭을 클릭 확인합니다.Right-click SelfHost in Solution Explorer and select Add Reference.... Select System.ServiceModel from the .NET tab and click OK.

    경우는 솔루션 탐색기 창이 표시, 선택 되지 않으면 솔루션 탐색기 에서 보기 메뉴.If the Solution Explorer window is not visible, select Solution Explorer from the View menu.

  5. 두 번 클릭 Program.cs 또는 Module1.vb솔루션 탐색기 열려 있지 않으면 코드 창에서 엽니다.Double-click Program.cs or Module1.vb in Solution Explorer to open it in the code window if it is not already open. 파일 맨 위에 다음 문을 추가합니다.Add the following statements at the top of the file.

    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    
  6. 서비스 계약을 정의 및 구현합니다.Define and implement a service contract. 이 예제에서는 서비스에 대한 입력을 기준으로 메시지를 반환하는 HelloWorldService를 정의합니다.This example defines a HelloWorldService that returns a message based on the input to the service.

    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string SayHello(string name);
    }
    
    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello, {0}", name);
        }
    }
    
    <ServiceContract()>
    Public Interface IHelloWorldService
        <OperationContract()>
        Function SayHello(ByVal name As String) As String
    End Interface
    
    Public Class HelloWorldService
        Implements IHelloWorldService
    
        Public Function SayHello(ByVal name As String) As String Implements IHelloWorldService.SayHello
            Return String.Format("Hello, {0}", name)
        End Function
    End Class
    

    참고

    추가 정보For more information about정의 및 서비스 인터페이스를 구현 하 고, 참조 하는 방법 하는 방법: 서비스 계약 정의하는 방법: 서비스 계약 구현합니다. how to define and implement a service interface, see How to: Define a Service Contract and How to: Implement a Service Contract.

  7. 서비스의 기본 주소를 사용하여 Main 메서드 맨 위에 Uri 클래스의 인스턴스를 만듭니다.At the top of the Main method, create an instance of the Uri class with the base address for the service.

    Uri baseAddress = new Uri("http://localhost:8080/hello");
    
    Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
    
  8. ServiceHost 클래스의 인스턴스를 만들어 서비스 형식 및 기본 주소 URI(Uniform Resource Identifier)를 나타내는 TypeServiceHost(Type, Uri[])에 전달합니다.Create an instance of the ServiceHost class, passing a Type that represents the service type and the base address Uniform Resource Identifier (URI) to the ServiceHost(Type, Uri[]). 메타데이터 게시를 사용하도록 설정한 다음 Open에서 ServiceHost 메서드를 호출하여 서비스를 초기화하고 메시지를 받도록 서비스를 준비합니다.Enable metadata publishing, and then call the Open method on the ServiceHost to initialize the service and prepare it to receive messages.

    // Create the ServiceHost.
    using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
    {
        // Enable metadata publishing.
        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
        host.Description.Behaviors.Add(smb);
    
        // Open the ServiceHost to start listening for messages. Since
        // no endpoints are explicitly configured, the runtime will create
        // one endpoint per base address for each service contract implemented
        // by the service.
        host.Open();
    
        Console.WriteLine("The service is ready at {0}", baseAddress);
        Console.WriteLine("Press <Enter> to stop the service.");
        Console.ReadLine();
    
        // Close the ServiceHost.
        host.Close();
    }
    
    ' Create the ServiceHost.
    Using host As New ServiceHost(GetType(HelloWorldService), baseAddress)
    
        ' Enable metadata publishing.
        Dim smb As New ServiceMetadataBehavior()
        smb.HttpGetEnabled = True
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
        host.Description.Behaviors.Add(smb)
    
        ' Open the ServiceHost to start listening for messages. Since
        ' no endpoints are explicitly configured, the runtime will create
        ' one endpoint per base address for each service contract implemented
        ' by the service.
        host.Open()
    
        Console.WriteLine("The service is ready at {0}", baseAddress)
        Console.WriteLine("Press <Enter> to stop the service.")
        Console.ReadLine()
    
        ' Close the ServiceHost.
        host.Close()
    
    End Using
    

    참고

    이 예제에서는 기본 끝점을 사용하며, 이 서비스에는 구성 파일이 필요하지 않습니다.This example uses default endpoints, and no configuration file is required for this service. 끝점을 구성하지 않으면 런타임이 서비스에서 구현되는 각 서비스 계약의 각 기본 주소에 대해 끝점을 하나씩 만듭니다.If no endpoints are configured, then the runtime creates one endpoint for each base address for each service contract implemented by the service. 추가 정보For more information about기본 끝점, 참조 단순화 된 구성WCF 서비스에 대 한 구성을 단순화합니다. default endpoints, see Simplified Configuration and Simplified Configuration for WCF Services.

  9. Ctrl+Shift+B를 눌러 솔루션을 빌드합니다.Press CTRL+SHIFT+B to build the solution.

서비스를 테스트하려면To test the service

  1. 서비스를 실행하려면 Ctrl+F5를 누릅니다.Press Ctrl + F5 to run the service.

  2. 열기 WCF 테스트 클라이언트합니다.Open WCF Test Client.

    열려는 WCF 테스트 클라이언트개방형는 Visual Studio 2012Visual Studio 2012 명령 프롬프트를 실행 WcfTestClient.exe합니다.To open WCF Test Client, open a Visual Studio 2012Visual Studio 2012 command prompt and execute WcfTestClient.exe.

  3. 선택 서비스 추가... 에서 파일 메뉴.Select Add Service... from the File menu.

  4. 형식 http://localhost:8080/hello 클릭 고 주소 상자에 확인합니다.Type http://localhost:8080/hello into the address box and click OK.

    서비스가 실행 중인지 확인하십시오. 그렇지 않으면 이 단계는 실패합니다.Make sure the service is running or else this step fails. 코드에서 기본 주소를 변경한 경우에는 이 단계에서 수정된 기본 주소를 사용하십시오.If you have changed the base address in the code, then use the modified base address in this step.

  5. 두 번 클릭 SayHello 아래는 내 서비스 프로젝트 노드.Double-click SayHello under the My Service Projects node. 사용자 이름을 입력 된 열에는 요청 목록으로 이동한 클릭 Invoke합니다.Type your name into the Value column in the Request list, and click Invoke. 회신 메시지에 표시 된 응답 목록입니다.A reply message appears in the Response list.

Example

다음 예제에서는 ServiceHost 개체를 만들어 HelloWorldService 형식의 서비스를 호스팅한 다음 Open에서 ServiceHost 메서드를 호출합니다.The following example creates a ServiceHost object to host a service of type HelloWorldService, and then calls the Open method on ServiceHost. 기본 주소는 코드에서 제공되고 메타데이터 게시가 사용하도록 설정되며 기본 끝점이 사용됩니다.A base address is provided in code, metadata publishing is enabled, and default endpoints are used.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace SelfHost
{
    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string SayHello(string name);
    }

    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello, {0}", name);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Uri baseAddress = new Uri("http://localhost:8080/hello");

            // Create the ServiceHost.
            using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
            {
                // Enable metadata publishing.
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                host.Description.Behaviors.Add(smb);

                // Open the ServiceHost to start listening for messages. Since
                // no endpoints are explicitly configured, the runtime will create
                // one endpoint per base address for each service contract implemented
                // by the service.
                host.Open();

                Console.WriteLine("The service is ready at {0}", baseAddress);
                Console.WriteLine("Press <Enter> to stop the service.");
                Console.ReadLine();

                // Close the ServiceHost.
                host.Close();
            }
        }
    }
}
Imports System.ServiceModel
Imports System.ServiceModel.Description

Module Module1

    <ServiceContract()>
    Public Interface IHelloWorldService
        <OperationContract()>
        Function SayHello(ByVal name As String) As String
    End Interface
    
    Public Class HelloWorldService
        Implements IHelloWorldService

        Public Function SayHello(ByVal name As String) As String Implements IHelloWorldService.SayHello
            Return String.Format("Hello, {0}", name)
        End Function
    End Class

    Sub Main()
        Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")

        ' Create the ServiceHost.
        Using host As New ServiceHost(GetType(HelloWorldService), baseAddress)

            ' Enable metadata publishing.
            Dim smb As New ServiceMetadataBehavior()
            smb.HttpGetEnabled = True
            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
            host.Description.Behaviors.Add(smb)

            ' Open the ServiceHost to start listening for messages. Since
            ' no endpoints are explicitly configured, the runtime will create
            ' one endpoint per base address for each service contract implemented
            ' by the service.
            host.Open()

            Console.WriteLine("The service is ready at {0}", baseAddress)
            Console.WriteLine("Press <Enter> to stop the service.")
            Console.ReadLine()

            ' Close the ServiceHost.
            host.Close()

        End Using

    End Sub

End Module

참고 항목See Also

Uri
AppSettings
ConfigurationManager
방법: IIS에서 WCF 서비스 호스트How to: Host a WCF Service in IIS
자체 호스팅Self-Host
서비스 호스팅Hosting Services
방법: 서비스 계약 정의How to: Define a Service Contract
방법: 서비스 계약 구현How to: Implement a Service Contract
ServiceModel Metadata 유틸리티 도구(Svcutil.exe)ServiceModel Metadata Utility Tool (Svcutil.exe)
바인딩을 사용하여 서비스 및 클라이언트 구성Using Bindings to Configure Services and Clients
시스템 제공 바인딩System-Provided Bindings