다음을 통해 공유


클라이언트: 채널 팩터리 및 채널

이 항목에서는 채널 팩터리 및 채널 만들기에 대해 설명합니다.

채널 팩터리 및 채널

채널 팩터리는 채널을 만듭니다. 채널 팩터리에서 만든 채널은 메시지를 보내는 데 사용됩니다. 이러한 채널은 위의 계층에서 메시지를 가져와서 필요한 모든 처리 작업을 수행한 다음 메시지를 아래 계층으로 보냅니다. 다음 그래픽에서는 이 프로세스를 보여 줍니다.

Client Factories and Channels
채널 팩터리가 채널을 만듭니다.

닫힌 채널 팩터리는 만든 채널 중에서 아직 닫히지 않은 채널을 닫습니다. 여기서는 채널 수신기가 닫혀 있기 때문에 모델이 비대칭이며, 새 채널 승인만 중지하고 기존 채널은 메시지 수신을 계속할 수 있도록 열린 상태로 유지합니다.

WCF는 이 프로세스에 대한 기본 클래스 도우미를 제공합니다. (이 항목에서 논의된 채널 도우미 클래스의 다이어그램은 채널 모델 개요를 참조하세요.)

다음 설명은 전송: UDP 샘플을 기반으로 합니다.

채널 팩터리 만들기

UdpChannelFactoryChannelFactoryBase에서 파생됩니다. 샘플에서는 메시지 인코더의 메시지 버전에 액세스할 수 있도록 GetProperty를 재정의합니다. 또한 상태 시스템이 전환될 때 OnClose의 인스턴스를 중지하도록 BufferManager를 재정의합니다.

UDP 출력 채널

UdpOutputChannelIOutputChannel을 구현합니다. 생성자는 인수의 유효성을 검사하여 전달되는 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  
);  

참고 항목