BindingElement 만들기
바인딩 및 바인딩 요소(각각 System.ServiceModel.Channels.Binding 및 System.ServiceModel.Channels.BindingElement를 확장하는 개체)에서 WCF(Windows Communication Foundation) 응용 프로그램 모델이 채널 팩터리 및 채널 수신기와 연결됩니다. 바인딩하지 않고 사용자 지정 채널을 사용하려면 서비스 채널 수준 프로그래밍 및 클라이언트 채널 수준 프로그래밍에 설명된 대로 채널 수준에서 프로그래밍해야 합니다. 이 항목에서는 WCF에서 채널을 사용하기 위한 최소 요구 사항, 채널에 사용할 BindingElement 개발 및 채널 개발의 4단계에서 설명한 응용 프로그램에서의 채널 사용 방법에 대해 설명합니다.
개요
채널에 사용할 BindingElement를 만들면 개발자가 WCF 응용 프로그램에서 이를 사용할 수 있습니다. 이러한 BindingElement 개체를 System.ServiceModel.ServiceHost 클래스에서 사용하여, 채널에 대한 정확한 형식 정보 없이 WCF 응용 프로그램을 채널에 연결할 수 있습니다.
BindingElement를 만들면 채널 개발에 설명된 나머지 채널 개발 단계를 수행하여 요구 사항에 따라 더 많은 기능을 사용할 수 있습니다.
바인딩 요소 추가
사용자 지정 BindingElement를 구현하려면 BindingElement에서 상속된 클래스를 작성합니다. 예를 들어, 대용량 메시지를 여러 개의 청크로 나누고 반대쪽 끝에서 이를 다시 어셈블할 수 있는 ChunkingChannel
을 개발한 경우 BindingElement를 구현하여 이를 사용하기 위해 바인딩을 구성하면 모든 바인딩에 이 채널을 사용할 수 있습니다. 이 항목의 나머지 부분에서는 바인딩 요소를 구현하기 위한 요구 사항을 설명하기 위해 ChunkingChannel
을 사용합니다.
ChunkingBindingElement
는 ChunkingChannelFactory
및 ChunkingChannelListener
를 만듭니다. 또한 CanBuildChannelFactory 및 CanBuildChannelListener 구현을 재정의하고, 형식 매개 변수가IDuplexSessionChannel(이 예제에서는 이 채널 셰이프가 ChunkingChannel
에서 지원하는 유일한 채널 셰이프임)인지 그리고 바인딩에 있는 다른 바인딩 요소가 이 채널 셰이프를 지원하는지를 확인합니다.
BuildChannelFactory는 요청한 채널 셰이프를 만들 수 있는지 먼저 확인한 다음 청크 분할되는 메시지 동작 목록을 가져옵니다. 그런 다음 새로운 ChunkingChannelFactory
를 만들고 이를 내부 채널 팩터리에 전달합니다. 전송 바인딩 요소를 만드는 경우 이 요소가 바인딩 스택의 마지막 요소이므로 채널 수신기나 채널 팩터리를 만들어야 합니다.
BuildChannelListener에서도 ChunkingChannelListener
를 만들어 내부 채널 수신기에 전달하는 구현 방법이 비슷합니다.
전송 채널을 사용하는 다른 예제인 Transport: UDP 샘플에서는 다음과 같은 재정의가 이루어집니다.
이 샘플의 바인딩 요소는 TransportBindingElement에서 파생된 UdpTransportBindingElement
로, 채널과 연결되는 팩터리 작성을 위한 다음 메서드를 재정의합니다.
public IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
{
return (IChannelFactory<TChannel>)(object)new UdpChannelFactory(this, context);
}
public IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
{
return (IChannelListener<TChannel>)(object)new UdpChannelListener(this, context);
}
이 바인딩 요소에는 BindingElement
를 복제하고 soap.udp 체계를 반환하는 멤버도 포함됩니다.
프로토콜 바인딩 요소
새 바인딩 요소는 포함된 바인딩 요소를 바꾸거나 확대할 수 있으며 새 전송, 인코딩 또는 더 높은 수준의 프로토콜을 추가할 수 있습니다. 새 프로토콜 바인딩 요소를 만들려면 먼저 BindingElement 클래스를 확장합니다. 그런 다음 최소한 System.ServiceModel.Channels.BindingElement.Clone을 구현하고 System.ServiceModel.Channels.IChannel.GetProperty를 사용하여 ChannelProtectionRequirements를 구현해야 합니다. 이렇게 하면 이 바인딩 요소에 대해 ChannelProtectionRequirements가 반환됩니다. 자세한 내용은 ChannelProtectionRequirements를 참조하십시오.
Clone은 이 바인딩 요소의 새 복사본을 반환합니다. 바인딩 요소 작성자는 기본 복사 생성자를 호출한 다음 이 클래스의 추가 필드를 복제하는 복사 생성자를 사용하여 Clone을 구현하는 것이 좋습니다.
전송 바인딩 요소
새 전송 바인딩 요소를 만들려면 TransportBindingElement 인터페이스를 확장합니다. 그런 다음 최소한 Clone 메서드와 System.ServiceModel.Channels.TransportBindingElement.Scheme 속성을 구현해야 합니다.
Clone – 이 바인딩 요소의 새 복사본을 반환합니다. 바인딩 요소 작성자는 기본 복사 생성자를 호출한 다음 이 클래스의 추가 필드를 복제하는 복사 생성자를 통해 Clone을 구현하는 것이 좋습니다.
Scheme – Scheme get 속성은 바인딩 요소로 표현되는 전송 프로토콜의 URI 체계를 반환합니다. 예를 들어 System.ServiceModel.Channels.HttpTransportBindingElement 및 System.ServiceModel.Channels.TcpTransportBindingElement는 각 해당 Scheme 속성에서 "http"와 "net.tcp"를 반환합니다.
인코딩 바인딩 요소
새 인코딩 바인딩 요소를 만들려면 먼저 BindingElement 클래스를 확장하고 System.ServiceModel.Channels.MessageEncodingBindingElement 클래스를 구현합니다. 그런 다음 최소한 Clone, System.ServiceModel.Channels.MessageEncodingBindingElement.CreateMessageEncoderFactory 메서드와 System.ServiceModel.Channels.MessageEncodingBindingElement.MessageVersion 속성을 구현해야 합니다.
Clone. 이 바인딩 요소의 새 복사본을 반환합니다. 바인딩 요소 작성자는 기본 복사 생성자를 호출한 다음 이 클래스의 추가 필드를 복제하는 복사 생성자를 사용하여 Clone을 구현하는 것이 좋습니다.
CreateMessageEncoderFactory. 새 인코더를 구현하는 실제 클래스에 핸들을 제공하고 MessageEncoder를 확장하는 MessageEncoderFactory를 반환합니다. 자세한 내용은 MessageEncoderFactory 및 MessageEncoder를 참조하십시오.
MessageVersion. 이 인코딩에 사용되는 MessageVersion을 반환합니다. 이는 사용 중인 SOAP 및 WS-Addressing 버전을 나타냅니다.
사용자 정의 인코딩 바인딩 요소에 대한 선택적 메서드 및 속성의 전체 목록은 MessageEncodingBindingElement를 참조하십시오.
새 바인딩 요소 만들기에 대한 자세한 내용은 사용자 정의 바인딩 만들기를 참조하십시오.
채널에 사용할 바인딩 요소를 만들었으면, 채널 개발 항목으로 돌아가서 바인딩 요소에 구성 파일 지원을 추가할지 여부, 메타데이터 게시 지원을 추가할지 여부 및 추가 방법, 바인딩 요소를 사용하는 사용자 정의 바인딩 생성 여부 및 생성 방법 등을 확인합니다.