다음을 통해 공유


엔드포인트 만들기 개요

WCF(Windows Communication Foundation) 서비스와의 모든 통신은 서비스의 엔드포인트를 통해 발생합니다. 엔드포인트는 WCF 서비스에서 제공하는 기능에 대한 액세스 권한을 클라이언트에 제공합니다. 이 섹션에서는 엔드포인트의 구조를 설명하고 구성 및 코드에서 엔드포인트를 정의하는 방법을 간략하게 설명합니다.

엔드포인트의 구조

각 엔드포인트에는 엔드포인트를 찾을 위치를 나타내는 주소, 클라이언트가 엔드포인트와 통신하는 방법을 지정하는 바인딩 및 사용 가능한 메서드를 식별하는 계약이 포함됩니다.

  • 주소입니다. 이 주소는 엔드포인트를 고유하게 식별하고 잠재적 소비자에게 서비스가 있는 위치를 알려줍니다. WCF 개체 모델 EndpointAddress 에서 URI(Uniform Resource Identifier) 및 ID, 일부 WSDL(Web Services Description Language) 요소 및 선택적 헤더 컬렉션을 포함하는 주소 속성을 포함하는 주소로 표시됩니다. 선택적 헤더는 엔드포인트를 식별하거나 상호 작용하는 추가 세부 주소 지정 정보를 제공합니다. 자세한 내용은 엔드포인트 주소 지정을 참조하세요.

  • 바인딩. 바인딩은 엔드포인트와 통신하는 방법을 지정합니다. 바인딩은 사용할 전송 프로토콜(예: TCP 또는 HTTP), 메시지에 사용할 인코딩(예: 텍스트 또는 이진) 및 필요한 보안 요구 사항(예: Secure Sockets Layer [SSL] 또는 SOAP 메시지 보안)을 포함하여 엔드포인트가 전 세계와 통신하는 방법을 지정합니다. 자세한 내용은 바인딩을 사용하여 서비스 및 클라이언트 구성을 참조하세요.

  • 서비스 계약. 서비스 계약은 엔드포인트가 클라이언트에 노출하는 기능을 간략하게 설명합니다. 계약은 클라이언트가 호출할 수 있는 작업, 메시지의 형식, 작업을 호출하는 데 필요한 입력 매개 변수 또는 데이터의 유형, 클라이언트가 예상할 수 있는 처리 또는 응답 메시지의 종류를 지정합니다. 세 가지 기본 유형의 계약은 MEP(기본 메시지 교환 패턴) 즉, 데이터그램(단방향), 요청/회신 및 이중(양방향)에 해당합니다. 또한 서비스 계약은 데이터 및 메시지 계약을 사용하여 액세스할 때 특정 데이터 형식 및 메시지 형식을 요구할 수 있습니다. 서비스 계약을 정의하는 방법에 대한 자세한 내용은 서비스 계약 디자인을 참조하세요. 또한 클라이언트는 이중 MEP로 서비스에서 메시지를 수신하기 위해 콜백 계약이라는 서비스 정의 계약을 구현해야 할 수도 있습니다. 자세한 내용은 Duplex Services를 참조하세요.

서비스에 대한 엔드포인트는 코드를 사용하여 명령적으로 또는 구성을 통해 선언적으로 지정할 수 있습니다. 엔드포인트가 지정되지 않은 경우 런타임은 서비스에서 구현하는 각 서비스 계약의 각 기본 주소에 대해 하나의 기본 엔드포인트를 추가하여 기본 엔드포인트를 제공합니다. 배포된 서비스에 대한 바인딩 및 주소는 일반적으로 서비스를 개발하는 동안 사용되는 것과 다르기 때문에 코드에서 엔드포인트를 정의하는 것은 일반적으로 실용적이지 않습니다. 일반적으로 코드보다는 구성을 사용하여 서비스 엔드포인트를 정의하는 것이 더 실용적입니다. 바인딩 및 주소 지정 정보를 코드에서 제외하면 애플리케이션을 다시 컴파일하고 다시 배포하지 않고도 변경할 수 있습니다.

비고

가장을 수행하는 서비스 엔드포인트를 추가할 때는 메서드 중 AddServiceEndpoint 하나 또는 GetContract(Type, Type) 메서드를 사용하여 계약을 새 ServiceDescription 개체에 올바르게 로드해야 합니다.

코드에서 엔드포인트 정의

다음 예제에서는 다음을 사용하여 코드에서 엔드포인트를 지정하는 방법을 보여 줍니다.

  • IEcho 유형의 서비스 계약을 정의하여 다른 사람의 이름을 받아들이고 "Hello <name>!"이라고 메아리쳐 응답하는 것입니다.

  • Echo 계약에 정의된 형식의 서비스를 구현합니다IEcho.

  • 서비스의 엔드포인트 주소를 http://localhost:8000/Echo 지정합니다.

  • Echo 서비스를 WSHttpBinding 바인딩을 사용하여 구성하다.

namespace Echo
{
   // Define the contract for the IEcho service
   [ServiceContract]
   public interface IEcho
   {
       [OperationContract]
       String Hello(string name)
   }

   // Create an Echo service that implements IEcho contract
   class Echo : IEcho
   {
      public string Hello(string name)
      {
         return "Hello" + name + "!";
      }
      public static void Main ()
      {
          //Specify the base address for Echo service.
          Uri echoUri = new Uri("http://localhost:8000/");

          //Create a ServiceHost for the Echo service.
          ServiceHost serviceHost = new ServiceHost(typeof(Echo),echoUri);

          // Use a predefined WSHttpBinding to configure the service.
          WSHttpBinding binding = new WSHttpBinding();

          // Add the endpoint for this service to the service host.
          serviceHost.AddServiceEndpoint(
             typeof(IEcho),
             binding,
             echoUri
           );

          // Open the service host to run it.
          serviceHost.Open();
     }
  }
}
' Define the contract for the IEcho service
    <ServiceContract()> _
    Public Interface IEcho
        <OperationContract()> _
        Function Hello(ByVal name As String) As String
    End Interface

' Create an Echo service that implements IEcho contract
    Public Class Echo
        Implements IEcho
        Public Function Hello(ByVal name As String) As String _
 Implements ICalculator.Hello
            Dim result As String = "Hello" + name + "!"
            Return result
        End Function

' Specify the base address for Echo service.
Dim echoUri As Uri = New Uri("http://localhost:8000/")

' Create a ServiceHost for the Echo service.
Dim svcHost As ServiceHost = New ServiceHost(GetType(HelloWorld), echoUri)

' Use a predefined WSHttpBinding to configure the service.
Dim binding As New WSHttpBinding()

' Add the endpoint for this service to the service host.
serviceHost.AddServiceEndpoint(GetType(IEcho), binding, echoUri)

' Open the service host to run it.
serviceHost.Open()

비고

서비스 호스트는 기본 주소를 사용하여 만든 다음, 기본 주소를 기준으로 나머지 주소는 엔드포인트의 일부로 지정됩니다. 이 주소 분할을 사용하면 호스트의 서비스에 대해 여러 엔드포인트를 보다 편리하게 정의할 수 있습니다.

비고

서비스 애플리케이션의 ServiceDescription 속성은 OnOpeningServiceHostBase 메서드가 실행된 후 수정되면 안 됩니다. Credentials 속성 및 AddServiceEndpoint 메서드를 포함한 일부 멤버는 ServiceHostBaseServiceHost에서 해당 시점을 지나 수정된 경우 예외를 발생시킵니다. 다른 것들은 수정이 가능하지만 결과는 불확실합니다.

마찬가지로 클라이언트에서 ServiceEndpoint 값을 OnOpeningChannelFactory에 호출한 후에는 변경해서는 안 됩니다. 해당 Credentials 지점을 지나서 수정하면 속성이 예외를 throw합니다. 다른 클라이언트 설명 값은 오류 없이 수정할 수 있지만 결과는 정의되지 않습니다.

서비스 또는 클라이언트에 대해 호출 Open하기 전에 설명을 수정하는 것이 좋습니다.

구성에서 엔드포인트 정의

애플리케이션을 만들 때 애플리케이션을 배포하는 관리자에게 결정을 연기하려는 경우가 많습니다. 예를 들어 서비스 주소(URI)가 무엇인지 미리 알 방법이 없는 경우가 많습니다. 주소를 하드 코딩하는 대신 관리자가 서비스를 만든 후 이 작업을 수행할 수 있도록 하는 것이 좋습니다. 이러한 유연성은 구성을 통해 수행됩니다. 자세한 내용은 서비스 구성을 참조하세요.

비고

ServiceModel 메타데이터 유틸리티 도구(Svcutil.exe)/config:[, 이름 스위치와 함께 사용하여, 구성 파일을 빠르게 만듭니다.

기본 엔드포인트 사용

코드 또는 구성에 엔드포인트가 지정되지 않은 경우 런타임은 서비스에서 구현하는 각 서비스 계약의 각 기본 주소에 대해 하나의 기본 엔드포인트를 추가하여 기본 엔드포인트를 제공합니다. 기본 주소는 코드 또는 구성에서 지정할 수 있으며, Open()에서 ServiceHost이 호출될 때 기본 엔드포인트가 추가됩니다. 이 예제는 이전 섹션과 동일한 예제이지만 엔드포인트가 지정되지 않으므로 기본 엔드포인트가 추가됩니다.

namespace Echo
{
   // Define the contract for the IEcho service
   [ServiceContract]
   public interface IEcho
   {
       [OperationContract]
       String Hello(string name)
   }

   // Create an Echo service that implements IEcho contract
   public class Echo : IEcho
   {
      public string Hello(string name)
      {
         return "Hello" + name + "!";
      }
      public static void Main ()
      {
          //Specify the base address for Echo service.
          Uri echoUri = new Uri("http://localhost:8000/");

          //Create a ServiceHost for the Echo service.
          ServiceHost serviceHost = new ServiceHost(typeof(Echo),echoUri);

          // Open the service host to run it. Default endpoints
          // are added when the service is opened.
          serviceHost.Open();
     }
  }
}
' Define the contract for the IEcho service
    <ServiceContract()> _
    Public Interface IEcho
        <OperationContract()> _
        Function Hello(ByVal name As String) As String
    End Interface

' Create an Echo service that implements IEcho contract
    Public Class Echo
        Implements IEcho
        Public Function Hello(ByVal name As String) As String _
 Implements ICalculator.Hello
            Dim result As String = "Hello" + name + "!"
            Return result
        End Function

' Specify the base address for Echo service.
Dim echoUri As Uri = New Uri("http://localhost:8000/")

' Open the service host to run it. Default endpoints
' are added when the service is opened.
serviceHost.Open()

엔드포인트가 명시적으로 제공된 경우, AddDefaultEndpoints을 호출하기 전에 ServiceHost을 호출하여 기본 엔드포인트를 Open에 추가할 수 있습니다. 기본 엔드포인트에 대한 자세한 내용은 WCF 서비스에 대한 간소화된 구성간소화된 구성을 참조하세요.

참고하십시오