사용자 지정 전송을 작성하는 첫 번째 단계는 개발하는 채널에 필요한 메시지 교환 패턴 (또는 MEP)을 결정하는 것입니다. 이 항목에서는 사용 가능한 옵션에 대해 설명하고 다양한 요구 사항에 대해 설명합니다. 채널 개발에 설명된 채널 개발 작업 목록의 첫 번째 작업 입니다.
6개 메시지 교환 패턴
선택할 수 있는 세 개의 MEP는 다음과 같습니다.
데이터그램(IInputChannel 및 IOutputChannel)
데이터그램 MEP를 사용하는 경우 클라이언트는 '발사 후 잊기' 방식으로 메시지를 보냅니다. 일단 발사 후 잊어버리는 거래는 성공적인 전달을 확인하는 외부 방식이 필요한 것입니다. 전송 중에 메시지가 손실되어 서비스에 도달하지 못할 수 있습니다. 클라이언트 끝에서 보내기 작업이 성공적으로 완료되면 원격 엔드포인트가 메시지를 수신했음을 보장하지 않습니다. 데이터그램은 신뢰할 수 있는 프로토콜 및 보안 프로토콜을 포함하여 자체 프로토콜을 빌드할 수 있으므로 메시징의 기본 구성 요소입니다. 클라이언트 데이터그램 채널은 인터페이스를 IOutputChannel 구현하고 서비스 데이터그램 채널은 인터페이스를 IInputChannel 구현합니다.
Request-Response(IRequestChannel 및 IReplyChannel)
이 MEP에서는 메시지가 전송되고 회신이 수신됩니다. 패턴은 요청-응답 쌍으로 구성됩니다. 요청-응답 호출의 예로는 RPC(원격 프로시저 호출) 및 브라우저 GET 요청이 있습니다. 이 패턴을 반이중이라고도합니다. 이 MEP에서 클라이언트 채널은 구현 IRequestChannel 하고 서비스 채널은 구현 IReplyChannel합니다.
이중(IDuplexChannel)
이중 MEP를 사용하면 임의의 수의 메시지를 클라이언트에서 보내고 임의의 순서로 받을 수 있습니다. 이중 MEP는 전화 대화와 같으며, 여기서 말하는 각 단어는 메시지입니다. 양쪽 모두 이 MEP에서 보내고 받을 수 있으므로 클라이언트 및 서비스 채널에서 구현하는 인터페이스는 다음과 같습니다 IDuplexChannel.
세 가지 기본 메시지 교환 패턴입니다. 상단에서 하단까지: 데이터그램, 요청-응답 및 양방향.
이러한 각 MEP는 세션을 지원할 수도 있습니다. 세션(및 형식System.ServiceModel.Channels.ISessionChannel<TSession>의 System.ServiceModel.Channels.ISession 구현)은 채널에서 보내고 받은 모든 메시지의 상관 관계를 지정합니다. 요청-응답 패턴은 요청과 회신의 상관 관계가 있으므로 독립 실행형 2개 메시지 세션입니다. 반면, 세션을 지원하는 요청-응답 패턴은 해당 채널의 모든 요청/응답 쌍이 서로 상호 연결됨을 의미합니다. 이렇게 하면 선택할 수 있는 총 6개의 MEP가 제공됩니다.
데이터 그램
요청-응답
이중
세션이 있는 데이터그램
세션을 사용하는 요청-응답 방식
세션을 활용한 풀 듀플렉스
비고
UDP 전송의 경우 지원되는 유일한 MEP는 데이터그램입니다. UDP는 기본적으로 실행 및 잊기 프로토콜이기 때문입니다.
세션 및 상태 유지 세션 채널
네트워킹 환경에서는 연결 지향 프로토콜(예: TCP) 및 연결 없는 프로토콜(예: UDP)이 있습니다. WCF는 "세션"이라는 용어를 연결과 유사한 논리적 추상화를 의미하는 데 사용합니다. 세션 WCF 프로토콜은 연결 지향 네트워크 프로토콜과 유사하며 세션 없는 WCF 프로토콜은 연결이 없는 네트워크 프로토콜과 유사합니다.
채널 개체 모델에서 각 논리 세션은 세션 채널의 인스턴스로 매니페스트됩니다. 따라서 클라이언트에서 만들고 서비스에 허용되는 모든 새 세션은 양쪽의 새 세션 채널에 해당합니다. 다음 다이어그램은 위쪽에서 세션 없는 채널의 구조와 아래쪽에 세션 채널의 구조를 보여 줍니다.
클라이언트는 새 세션 채널을 만들고 메시지를 보냅니다. 서비스 쪽에서 채널 수신기는 이 메시지를 수신하고 새 세션에 속하는 것을 감지하여 새 세션 채널을 만들고 애플리케이션에 연결합니다(채널 수신기에서 AcceptChannel을 호출하는 애플리케이션에 대한 응답). 그러면 애플리케이션은 이 메시지와 동일한 세션 채널을 통해 동일한 세션에서 전송된 모든 후속 메시지를 받습니다.
다른 클라이언트(또는 동일한 클라이언트)가 새로운 세션을 만들고 메시지를 보냅니다. 채널 수신기는 이 메시지가 새 세션에 있는 것을 감지하고 새 세션 채널을 만들고 프로세스가 반복됩니다.
세션이 없으면 채널과 세션 간에 상관 관계가 없습니다. 따라서 채널 수신기는 수신된 모든 메시지가 애플리케이션에 배달되는 하나의 채널만 만듭니다. 메시지 순서를 유지할 세션이 없으므로 메시지 순서도 없습니다. 이전 그래픽의 위쪽 부분에서는 세션 없는 메시지 교환을 보여 줍니다.
세션 시작 및 종료
세션은 단순히 새 세션 채널을 만들어 클라이언트에서 시작됩니다. 서비스가 새 세션에서 보낸 메시지를 받을 때 시작됩니다. 마찬가지로 세션 채널을 닫거나 중단하여 세션이 종료됩니다.
이에 대한 예외는 IDuplexSessionChannel 이중 세션 통신 패턴으로 메시지를 보내고 받는 데 사용됩니다. 한 쪽에서 메시지 전송을 중단하려고 할 때 메시지를 계속 받을 수 있도록 IDuplexSessionChannel를 사용할 경우, 더 이상 메시지를 보내지 않지만, 입력 세션은 계속 열려 있게 하여 메시지를 받을 수 있는 메커니즘이 있습니다. 이 메커니즘을 통해 출력 세션을 닫을 수 있게 됩니다.
일반적으로 세션은 들어오는 쪽이 아니라 나가는 쪽에서 닫힙니다. 즉, 세션 출력 채널을 닫아 세션을 완전히 종료할 수 있습니다. 세션 출력 채널을 닫으면 해당 세션 입력 채널이 null을 호출하는 애플리케이션 IInputChannel.Receive 에 IDuplexSessionChannel반환합니다.
그러나 세션을 포함한 입력 채널은 IInputChannel.Receive에서 반환값이 null이 되어 세션이 이미 닫혀 있다고 표시되는 경우를 제외하고는 IDuplexSessionChannel에서 닫혀서는 안 됩니다. IInputChannel.Receive에서 IDuplexSessionChannel가 null을 반환되지 않은 경우, 세션 풀 입력 채널을 닫으면 받는 도중에는 예기치 않은 메시지를 받을 수 있으므로 예외가 발생할 수 있습니다. 수신자가 세션을 종료하기 전에 수신자가 세션을 종료하려는 경우 입력 채널을 호출 Abort 해야 합니다. 그러면 세션이 갑자기 종료됩니다.
세션 채널 작성
세션을 지원하는 채널 작성자로서, 채널이 세션을 제공하기 위해 수행해야 하는 필수적인 작업이 몇 가지 있습니다. 송신 쪽에서 채널은 다음을 수행해야 합니다.
각 새 채널에 대해 새 세션을 만들고 고유한 문자열인 새 세션 ID와 연결합니다. 또는 스택에서 아래에 있는 세션이 있는 채널에서 새 세션을 얻으세요.
이 채널을 사용하여 전송된 각 메시지에 대해 채널이 세션을 만든 경우(아래 계층에서 가져오는 것이 아니라) 세션과 메시지를 연결해야 합니다. 프로토콜 채널의 경우 일반적으로 SOAP 헤더를 추가하여 수행됩니다. 전송 채널의 경우 일반적으로 새 전송 연결을 만들거나 프레이밍 프로토콜에 세션 정보를 추가하여 수행됩니다.
이 채널을 사용하여 보낸 각 메시지에 대해 위에서 언급한 배달 보증을 제공해야 합니다. 아래 채널을 사용하여 세션을 제공하는 경우 해당 채널은 배달 보장도 제공합니다. 세션을 직접 제공하는 경우 프로토콜의 일부로 이러한 보장을 구현해야 합니다. 일반적으로 양쪽에서 WCF를 가정하는 프로토콜 채널을 작성하는 경우 TCP 전송 또는 신뢰할 수 있는 메시징 채널이 필요하고 세션을 제공하기 위해 둘 중 하나에 의존할 수 있습니다.
채널에서 ICommunicationObject.Close가 호출될 때, 지정된 시간 제한이나 기본 시간 제한을 사용하여 세션을 닫는 데 필요한 작업을 수행하세요. 이는 아래 채널에서 호출 Close 하거나(세션을 방금 가져온 경우) 특수 SOAP 메시지를 보내거나 전송 연결을 닫는 것만큼 간단할 수 있습니다.
Abort 채널에서 호출되면 I/O를 수행하지 않고 세션을 갑자기 종료합니다. 이는 아무 작업도 수행하지 않거나 네트워크 연결 또는 일부 다른 리소스를 중단하는 것을 의미할 수 있습니다.
수신 쪽에서 채널은 다음을 수행해야 합니다.
들어오는 각 메시지에 대해 채널 수신기가 속한 세션을 검색해야 합니다. 세션의 첫 번째 메시지인 경우 채널 수신기는 새 채널을 만들고 호출 IChannelListener<TChannel>.AcceptChannel에서 반환해야 합니다. 그렇지 않으면 채널 수신기는 세션에 해당하는 기존 채널을 찾아 해당 채널을 통해 메시지를 전달해야 합니다.
채널이 필요한 배달 보장과 함께 세션을 제공하는 경우 수신 측은 메시지 다시 주문 또는 승인 보내기와 같은 일부 작업을 수행해야 할 수 있습니다.
Close이 채널에서 호출되면, 지정된 시간 제한 또는 기본 시간 제한 중 하나로 세션을 종료하는 데 필요한 작업을 수행하십시오. 이로 인해 닫기 시간 제한이 만료될 때까지 기다리는 동안 채널이 메시지를 수신하는 경우 예외가 발생할 수 있습니다. 이는 채널이 메시지를 받을 때 닫는 상태가 되므로 채널이 throw되기 때문입니다.
Abort 채널에서 호출되면 I/O를 수행하지 않고 세션을 갑자기 종료합니다. 다시 말하지만, 이는 아무 작업도 수행하지 않거나 네트워크 연결 또는 일부 다른 리소스를 중단하는 것을 의미할 수 있습니다.