다음을 통해 공유


User-Defined 바인딩 생성하기

시스템에서 제공하지 않는 바인딩을 만드는 방법에는 여러 가지가 있습니다.

  • 바인딩 요소로 채우는 컨테이너인 클래스를 기반으로 CustomBinding 사용자 지정 바인딩을 만듭니다. 그러면 사용자 지정 바인딩이 서비스 엔드포인트에 추가됩니다. 프로그래밍 방식으로 또는 애플리케이션 구성 파일에서 사용자 지정 바인딩을 만들 수 있습니다. 애플리케이션 구성 파일에서 바인딩 요소를 사용하려면 바인딩 요소가 확장 BindingElementExtensionElement되어야 합니다. 사용자 지정 바인딩에 대한 자세한 내용은 사용자 지정 바인딩 및CustomBinding를 참조하세요.

  • 표준 바인딩에서 파생되는 클래스를 만들 수 있습니다. 예를 들어 클래스 WSHttpBinding를 파생시키고 CreateBindingElements 메서드를 재정의하여 바인딩 요소를 확인하고 사용자 지정 바인딩 요소를 삽입하거나 보안을 위해 특정 값을 설정할 수 있습니다.

  • Binding 형식을 만들어 전체 바인딩 구현을 완전히 제어할 수 있습니다.

바인딩 요소의 순서

각 바인딩 요소는 메시지를 보내거나 받을 때 처리 단계를 나타냅니다. 런타임에 바인딩 요소는 나가는 채널 및 들어오는 채널 스택을 빌드하는 데 필요한 채널 및 수신기를 만듭니다.

바인딩 요소에는 프로토콜 바인딩 요소, 인코딩 바인딩 요소 및 전송 바인딩 요소의 세 가지 주요 형식이 있습니다.

프로토콜 바인딩 요소 – 이러한 요소는 메시지에 대해 작동하는 상위 수준 처리 단계를 나타냅니다. 이러한 바인딩 요소에서 만든 채널 및 수신기는 메시지 콘텐츠를 추가, 제거 또는 수정할 수 있습니다. 지정된 바인딩에는 각각 상속되는 임의의 수의 프로토콜 바인딩 요소가 있을 수 있습니다 BindingElement. WCF(Windows Communication Foundation)에는 ReliableSessionBindingElementSymmetricSecurityBindingElement을 포함하여 여러 프로토콜 바인딩 요소가 포함되어 있습니다.

바인딩 요소 인코딩 – 이러한 요소는 메시지와 와이어에서 전송할 준비가 된 인코딩 간의 변환을 나타냅니다. 일반적인 WCF 바인딩에는 정확히 하나의 인코딩 바인딩 요소가 포함됩니다. 인코딩 바인딩 요소의 예로는 MtomMessageEncodingBindingElement, 및 BinaryMessageEncodingBindingElementTextMessageEncodingBindingElement. 바인딩에 대해 인코딩 바인딩 요소를 지정하지 않으면 기본 인코딩이 사용됩니다. 기본값은 전송이 HTTP이고 그렇지 않으면 이진일 때 텍스트입니다.

전송 바인딩 요소 – 이러한 요소는 전송 프로토콜에서 인코딩 메시지의 전송을 나타냅니다. 일반적인 WCF 바인딩에는 정확히 하나의 전송 바인딩 요소가 포함됩니다. 이 요소는 TransportBindingElement에서 상속됩니다. 전송 바인딩 요소의 예로는 TcpTransportBindingElement, 및 HttpTransportBindingElementNamedPipeTransportBindingElement.

새 바인딩을 만들 때 추가된 바인딩 요소의 순서가 중요합니다. 항상 다음 순서로 바인딩 요소를 추가합니다.

레이어 옵션 필수
트랜잭션 흐름 System.ServiceModel.Channels.TransactionFlowBindingElement 아니오
신뢰도 System.ServiceModel.Channels.ReliableSessionBindingElement 아니오
안전 System.ServiceModel.Channels.SecurityBindingElement 아니오
복합 이중 System.ServiceModel.Channels.CompositeDuplexBindingElement 아니오
인코딩 텍스트, 바이너리, MTOM, 사용자 정의 예*
운송 TCP, 명명된 파이프, HTTP, HTTPS, MSMQ, 사용자 지정

*각 바인딩에 인코딩이 필요하므로 인코딩을 지정하지 않으면 WCF에서 기본 인코딩을 추가합니다. 기본값은 HTTP 및 HTTPS 전송에 대한 텍스트/XML이고, 그렇지 않으면 이진입니다.

새 Binding 요소 만들기

WCF에서 제공하는 형식 외에도 BindingElement 고유한 바인딩 요소를 만들 수 있습니다. 이를 통해 고유한 BindingElement 형식을 만들어 스택의 다른 시스템 제공 형식과 결합할 수 있으며, 이를 통해 바인딩 스택을 생성하는 방식과 그 안에 포함될 구성 요소를 사용자 지정할 수 있습니다.

예를 들어 데이터베이스에 LoggingBindingElement 메시지를 기록하는 기능을 제공하는 구현하는 경우 채널 스택의 전송 채널 위에 배치해야 합니다. 이 경우, 애플리케이션은 아래 예제와 같이 LoggingBindingElementTcpTransportBindingElement으로 구성된 사용자 지정 바인딩을 만듭니다.

Binding customBinding = new CustomBinding(  
  new LoggingBindingElement(),
  new TcpTransportBindingElement()  
);  

새 바인딩 요소를 작성하는 방법은 정확한 기능에 따라 달라집니다. 샘플 중 하나인 전송: UDP는 한 종류의 바인딩 요소를 구현하는 방법에 대한 자세한 설명을 제공합니다.

새 바인딩 만들기

사용자가 만든 바인딩 요소는 두 가지 방법으로 사용할 수 있습니다. 이전 섹션에서는 사용자 지정 바인딩을 통한 첫 번째 방법을 보여 줍니다. 사용자 지정 바인딩을 사용하면 사용자가 만든 바인딩 요소를 포함하여 임의의 바인딩 요소 집합을 기반으로 고유한 바인딩을 만들 수 있습니다.

둘 이상의 애플리케이션에서 바인딩을 사용하는 경우 고유한 바인딩을 만들고 확장합니다 Binding. 이렇게 하면 사용자 지정 바인딩을 사용할 때마다 수동으로 바인딩을 만들지 않습니다. 사용자 정의 바인딩을 사용하면 바인딩의 동작을 정의하고 사용자 정의 바인딩 요소를 포함할 수 있습니다. 그리고 미리 패키지되어 있습니다. 바인딩을 사용할 때마다 바인딩을 다시 빌드할 필요가 없습니다.

최소한 사용자 정의 바인딩은 CreateBindingElements 메서드와 Scheme 속성을 구현해야 합니다.

메서드는 CreateBindingElements 바인딩에 대 한 바인딩 요소를 포함 하는 새 BindingElementCollection 반환 합니다. 컬렉션은 순서가 지정되며 먼저 프로토콜 바인딩 요소와 인코딩 바인딩 요소, 전송 바인딩 요소를 포함해야 합니다. WCF 시스템 제공 바인딩 요소를 사용하는 경우 사용자 지정 바인딩에 지정된 바인딩 요소 순서 규칙을 따라야 합니다. 이 컬렉션은 사용자 정의 바인딩 클래스 내에서 참조되는 개체를 참조해서는 안 됩니다. 따라서 바인딩 작성자는 각 호출Clone()BindingElementCollection 값을 CreateBindingElements 반환해야 합니다.

이 속성은 Scheme 바인딩에서 사용 중인 전송 프로토콜에 대한 URI 체계를 나타냅니다. 예를 들어 WSHttpBindingNetTcpBinding 은 해당 Scheme 속성에서 "http" 및 "net.tcp"를 반환합니다.

사용자 정의 바인딩에 대한 선택적 메서드 및 속성의 전체 목록은 다음을 참조하세요 Binding.

예시

이 예제에서는 SampleProfileUdpBinding에서 파생된 Binding의 프로필 바인딩을 구현합니다. 여기에는 SampleProfileUdpBinding 최대 4개의 바인딩 요소(사용자가 만든 UdpTransportBindingElement요소 1개, 시스템 제공 3개, TextMessageEncodingBindingElementCompositeDuplexBindingElement및 .ReliableSessionBindingElement)가 포함됩니다.

public override BindingElementCollection CreateBindingElements()  
{
    BindingElementCollection bindingElements = new BindingElementCollection();  
    if (ReliableSessionEnabled)  
    {  
        bindingElements.Add(session);  
        bindingElements.Add(compositeDuplex);  
    }  
    bindingElements.Add(encoding);  
    bindingElements.Add(transport);  
    return bindingElements.Clone();  
}  

이중 계약을 사용하는 보안 제한 사항

모든 바인딩 요소가 서로 호환되는 것은 아닙니다. 특히 이중 계약과 함께 사용할 경우 보안 바인딩 요소에 대한 몇 가지 제한 사항이 있습니다.

One-Shot 보안

메시지negotiateServiceCredential 구성 요소의 <속성을 >으로 설정하여 필요한 모든 보안 자격 증명을 단일 메시지로 보내는 "원샷" 보안을 구현할 수 있습니다.

단발 인증은 이중 계약에서 작동하지 않습니다.

Request-Reply 계약의 경우 보안 바인딩 요소 아래의 바인딩 스택이 만들기 IRequestChannel 또는 IRequestSessionChannel 인스턴스를 지원하는 경우에만 원샷 인증이 작동합니다.

단방향 계약의 경우 보안 바인딩 요소 아래의 바인딩 스택이 인스턴스 만들기 IRequestChannelIRequestSessionChannelIOutputChannelIOutputSessionChannel 를 지원하는 경우 단발 인증이 작동합니다.

쿠키 모드 보안 컨텍스트 토큰은 이중 계약과 함께 사용할 수 없습니다.

Request-Reply 계약의 경우, 보안 바인딩 요소 아래의 바인딩 스택이 IRequestChannel 또는 IRequestSessionChannel 인스턴스를 생성할 수 있도록 지원할 때에만 쿠키 모드 보안 컨텍스트 토큰이 작동합니다.

단방향 계약의 경우 보안 바인딩 요소 아래의 바인딩 스택이 만들기 IRequestChannel 또는 IRequestSessionChannel 인스턴스를 지원하는 경우 쿠키 모드 보안 컨텍스트 토큰이 작동합니다.

세션 모드 보안 컨텍스트 토큰

세션 모드 SCT는 보안 바인딩 요소 아래의 바인딩 스택이 만들기 IDuplexChannel 또는 IDuplexSessionChannel 인스턴스를 지원하는 경우 이중 계약에 대해 작동합니다.

세션 모드 SCT는 보안 바인딩 요소 아래의 바인딩 스택이 인스턴스 생성IDuplexChannelIDuplexSessionChannelIRequestChannelIRequestSessionChannel지원하는 경우 Request-Reply 계약에 대해 작동합니다.

세션 모드 SCT는 보안 바인딩 요소 아래의 바인딩 스택이 인스턴스 만들기 IDuplexChannelIDuplexSessionChannelIRequestChannelIRequestSessionChannel 를 지원하는 경우 1방향 계약에 대해 작동합니다.

표준 바인딩에서 파생

완전히 새로운 바인딩 클래스를 만드는 대신 기존 시스템 제공 바인딩 중 하나를 확장할 수 있습니다. 앞의 경우와 마찬가지로 CreateBindingElements 메서드와 Scheme 속성을 재정의해야 합니다.

참고하십시오