클라이언트: 채널 팩터리 및 채널
이 항목에서는 채널 팩터리 및 채널 만들기에 대해 설명합니다.
채널 팩터리 및 채널
채널 팩터리는 채널을 만듭니다. 채널 팩터리에서 만든 채널은 메시지를 보내는 데 사용됩니다. 이러한 채널은 위의 계층에서 메시지를 가져와서 필요한 모든 처리 작업을 수행한 다음 메시지를 아래 계층으로 보냅니다. 다음 그래픽에서는 이 프로세스를 보여 줍니다.
채널 팩터리가 채널을 만듭니다.
닫힌 채널 팩터리는 만든 채널 중에서 아직 닫히지 않은 채널을 닫습니다. 여기서는 채널 수신기가 닫혀 있기 때문에 모델이 비대칭이며, 새 채널 승인만 중지하고 기존 채널은 메시지 수신을 계속할 수 있도록 열린 상태로 유지합니다.
WCF는 이 프로세스에 대한 기본 클래스 도우미를 제공합니다. (이 항목에서 논의된 채널 도우미 클래스의 다이어그램은 채널 모델 개요를 참조하세요.)
CommunicationObject 클래스는 ICommunicationObject를 구현하고 채널 개발의 2단계에 설명된 상태 시스템을 적용합니다.
ChannelManagerBase 클래스는 CommunicationObject를 구현하고 System.ServiceModel.Channels.ChannelFactoryBase 및 System.ServiceModel.Channels.ChannelListenerBase에 대한 통합 기본 클래스를 제공합니다. ChannelManagerBase 클래스는 ChannelBase을 구현하는 기본 클래스인 IChannel와 함께 사용됩니다.
ChannelFactoryBase 클래스는 ChannelManagerBase 및 IChannelFactory를 구현하고
CreateChannel
오버로드를 하나의OnCreateChannel
추상 메서드에 통합합니다.ChannelListenerBase 클래스는 IChannelListener를 구현합니다. 이 클래스는 기본 상태 관리를 담당합니다.
다음 설명은 전송: UDP 샘플을 기반으로 합니다.
채널 팩터리 만들기
UdpChannelFactory
는 ChannelFactoryBase에서 파생됩니다. 샘플에서는 메시지 인코더의 메시지 버전에 액세스할 수 있도록 GetProperty를 재정의합니다. 또한 상태 시스템이 전환될 때 OnClose의 인스턴스를 중지하도록 BufferManager를 재정의합니다.
UDP 출력 채널
UdpOutputChannel
은 IOutputChannel을 구현합니다. 생성자는 인수의 유효성을 검사하여 전달되는 EndPoint를 기반으로 대상 EndpointAddress 개체를 구성합니다.
OnOpen을 재정의하면 이 EndPoint에 메시지를 보내는 데 사용되는 소켓이 생성됩니다.
this.socket = new Socket(
this.remoteEndPoint.AddressFamily,
SocketType.Dgram,
ProtocolType.Udp
);
채널이 정상적 또는 비정상적으로 닫힐 수 있습니다. 채널이 정상적으로 닫히면 소켓이 닫히고 기본 클래스 OnClose
메서드가 호출됩니다. 이 때 예외가 throw되면 인프라가 Abort
를 호출하여 채널을 정리합니다.
this.socket.Close();
base.OnClose(timeout);
Send()
및 BeginSend()
/EndSend()
를 구현합니다. 그러면 두 개의 기본 섹션으로 분할됩니다. 먼저 메시지를 바이트 배열로 serialize합니다.
ArraySegment<byte> messageBuffer = EncodeMessage(message);
그런 다음 네트워크를 통해 결과 데이터를 보냅니다.
this.socket.SendTo(
messageBuffer.Array,
messageBuffer.Offset,
messageBuffer.Count,
SocketFlags.None,
this.remoteEndPoint
);