채널
채널은 응용 프로그램 도메인, 프로세스 또는 컴퓨터 간의 메시지 전송을 포함하여 원격 경계를 넘는 여러 응용 프로그램 간에 메시지를 전송하는 개체입니다. 채널에서는 한 끝점에서 인바운드 메시지를 수신하거나 다른 끝점으로 아웃바운드 메시지를 보내거나 이 둘 모두를 수행할 수 있습니다. 채널을 사용하면 다양한 프로토콜에 연결할 수 있습니다. 이는 공용 언어 런타임이 채널의 다른 쪽 끝점에 있지 않은 경우에도 해당됩니다.
채널은 ChannelName 및 ChannelPriority 같은 정보 속성을 제공하는 IChannel 인터페이스를 구현해야 합니다. IChannelReceiver를 구현하는 채널은 특정 포트에서 특정 프로토콜을 수신하고, IChannelSender를 구현하는 채널은 정보를 보냅니다. TcpChannel 및 HttpChannel 개체는 이 두 인터페이스를 모두 구현하므로 정보를 보내거나 받는 데 모두 사용할 수 있습니다.
다음과 같은 방법으로 원격 인프라에 채널을 등록할 수 있습니다.
원격화할 수 있는 개체를 게시하려는 경우, 서버 개체를 등록하기 전에 ChannelServices.RegisterChannel을 호출합니다.
원격화할 수 있는 개체의 기능을 사용하려는 경우, 서버 개체의 인스턴스를 만들기 전에 RegisterChannel을 호출합니다.
원격 구성 파일에서도 채널을 로드할 수 있습니다. 자세한 내용은 구성을 참조하십시오.
클라이언트측에서 메시지는 클라이언트 컨텍스트 체인을 통과한 후 클라이언트 채널 싱크 체인에 전달됩니다. 첫 번째 채널 싱크는 일반적으로 포맷터 싱크입니다. 이 싱크에서는 메시지를 스트림으로 serialize하며, 그런 다음에는 serialize된 스트림이 채널 싱크 체인으로 전달되어 클라이언트 전송 싱크로 전달됩니다. 클라이언트 전송 싱크에서는 이 스트림을 유선 채널에 씁니다.
서버측에서는 서버 전송 싱크가 유선에서 요청을 읽은 다음 요청 스트림을 서버 채널 싱크 체인에 전달합니다. 이 체인의 끝에 있는 서버 포맷터 싱크는 요청을 메시지로 deserialize합니다. 그런 다음 이 메시지를 원격 인프라에 전달합니다. 채널 싱크에 대한 자세한 내용은 싱크 및 싱크 체인을 참조하십시오.
채널 규칙
클라이언트에서 원격 개체에 대한 메서드를 호출하면 매개 변수와 기타 호출 관련 세부 정보가 채널을 통해 원격 개체로 전송됩니다. 호출 결과 역시 같은 방식으로 반환됩니다. 클라이언트에서는 서버에 등록된 채널을 임의로 선택하여 원격 개체와 통신할 수 있으므로 개발자는 자신의 필요에 가장 적합한 채널을 마음대로 선택할 수 있습니다. 또한 기존 채널을 사용자 지정하거나 다른 통신 프로토콜을 사용하는 새 채널을 만들 수도 있습니다. 채널을 선택할 때에는 대개 다음과 같은 규칙을 따릅니다.
서버의 원격 시스템에 채널이 하나 이상 등록되어 있어야 원격 개체를 호출할 수 있으며, 채널을 먼저 등록한 다음 개체를 등록해야 합니다. 채널을 클라이언트에 등록하지 않으면 원격 시스템에서는 채널을 선택하거나 만들어 아웃바운드 호출을 전송합니다.
참고
클라이언트에서 콜백 함수를 필요로 하는 경우 클라이언트에 수신 채널을 등록하고 서버에서는 호환되는 채널을 사용하도록 구성해야 합니다.
채널은 응용 프로그램 도메인 단위로 등록되며, 한 프로세스에 여러 개의 응용 프로그램 도메인이 포함될 수 있습니다. 프로세스의 작동이 끝나면 해당 프로세스에서 등록한 모든 채널은 자동 소멸됩니다.
채널 이름은 응용 프로그램 도메인 내에서 고유해야 합니다. 예를 들어, 기본 채널에는 이름이 있으므로 한 응용 프로그램 도메인에 두 개의 HttpChannel 개체를 등록하려면 채널을 등록하기 전에 먼저 채널 이름을 변경해야 합니다. 다음 C# 코드 예에서 이를 보여 줍니다.
IDictionary prop = new Hashtable(); prop["name"] = "http1"; prop["port"] = "9001"; ChannelServices.RegisterChannel(new HttpChannel(prop, null, null));
특정 포트에서 두 번 이상 수신하는 채널은 등록할 수 없습니다. 채널은 응용 프로그램 도메인 단위로 등록되지만 같은 포트에서 수신하는 동일한 채널을 같은 컴퓨터의 서로 다른 응용 프로그램 도메인에서 등록할 수는 없습니다.
포트를 사용할 수 있는지 여부가 확실하지 않은 경우, 채널 포트를 구성할 때 0(영)을 사용하면 원격 시스템에서 사용할 수 있는 포트를 자동으로 선택합니다.
클라이언트에서는 등록된 채널을 사용하여 원격 개체와 통신할 수 있습니다. 클라이언트에서 원격 개체에 연결을 시도할 때 원격 시스템에서는 해당 개체가 올바른 채널에 연결되어 있는지 확인합니다. 클라이언트는 원격 개체와 통신을 시도하기 전에 ChannelServices.RegisterChannel을 호출해야 합니다. 콜백 함수가 필요한 경우에는 클라이언트가 채널과 포트를 등록해야 합니다.
클라이언트에서 프록시에 대한 메서드를 호출하면 해당 호출은 차단되고 메시지로 묶여 RealProxy 클래스의 인스턴스에 전달됩니다. RealProxy 클래스는 메시지를 메시지 싱크로 전달하여 처리합니다. 메시지 싱크는 원격 개체에서 등록한 채널에 연결을 설정하고 해당 채널을 통해 원래 응용 프로그램 도메인으로 메시지를 디스패치합니다. 이 때 메시지는 역 마샬링되고 원격 개체 자체에 대한 호출이 실행됩니다.
원격 서비스를 통해 클라이언트의 도메인에 있는 원격 개체에 대한 프록시가 초기화되면 클라이언트에서 선택한 채널에 대해 IChannelSender.CreateMessageSink를 호출함으로써 구성한 채널에서 원격 개체와 통신할 수 있는 메시지 싱크가 검색됩니다.
원격 개체와 채널의 관계는 원격 시스템에서 혼동되기 쉬운 부분입니다. 예를 들어, WellKnownObjectMode.SingleCall 원격 개체의 경우 호출이 도착할 때만 활성화된다면 이 개체는 어떻게 클라이언트 연결을 수신 대기할 수 있을까요?
이는 부분적으로 원격 개체가 채널을 공유하며 자체 채널을 소유하지 않기 때문에 가능합니다. 원격 개체를 호스팅하는 서버 응용 프로그램에서는 원격 시스템으로 노출시키는 개체는 물론 필요한 채널을 모두 등록해야 합니다. 등록된 채널은 지정된 포트에서 클라이언트 요청에 대한 수신 대기를 자동으로 시작합니다. 동기 호출의 경우에는 메시지를 호출하는 동안 클라이언트로부터의 연결이 유지됩니다. 각 클라이언트 연결은 고유한 스레드에서 처리되므로 단일 채널에서 동시에 여러 클라이언트를 서비스할 수 있습니다.
참고 항목
참조
개념
채널 선택
Serialization 포맷터
싱크 및 싱크 체인