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 속성은 OnOpening의 ServiceHostBase 메서드가 실행된 후 수정되면 안 됩니다.
Credentials 속성 및 AddServiceEndpoint
메서드를 포함한 일부 멤버는 ServiceHostBase와 ServiceHost에서 해당 시점을 지나 수정된 경우 예외를 발생시킵니다. 다른 것들은 수정이 가능하지만 결과는 불확실합니다.
마찬가지로 클라이언트에서 ServiceEndpoint 값을 OnOpening를 ChannelFactory에 호출한 후에는 변경해서는 안 됩니다. 해당 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 서비스에 대한 간소화된 구성 및 간소화된 구성을 참조하세요.