채널
이 항목은 이전 버전의 기존 응용 프로그램과의 호환성을 위해 유지되고 있으나 새로운 개발에는 권장되지 않는 레거시 기술에 대해 설명합니다. 분산 응용 프로그램은 이제 WCF(Windows Communication Foundation)를 사용하여 개발됩니다.
채널은 응용 프로그램 도메인, 프로세스 또는 컴퓨터와 같은 원격 경계를 가로질러 응용 프로그램 간에 메시지를 전송하는 개체입니다. 채널은 인바운드 메시지를 끝점에서 수신하고 아웃바운드 메시지를 다른 끝점으로 보낼 수 있습니다. 그러면 채널의 다른 쪽 끝에 공용 언어 런타임이 없어도 광범위한 프로토콜을 연결할 수 있습니다.
채널은 ChannelName 및 ChannelPriority 같은 정보 속성을 제공하는 IChannel 인터페이스를 구현해야 합니다. 특정 포트에서 특정 프로토콜을 수신 대기하도록 설계된 채널은 IChannelReceiver를 구현하고 정보를 보내도록 설계된 채널은 IChannelSender를 구현합니다. TcpChannel 및 HttpChannel 개체는 두 인터페이스를 모두 구현하므로 정보를 보내거나 받는 데 사용할 수 있습니다.
다음과 같은 방식으로 원격 인프라에 채널을 등록할 수 있습니다.
원격으로 사용 가능한 개체를 게시하는 경우 서버 개체를 등록하기 전에 ChannelServices.RegisterChannel을 호출합니다.
원격으로 사용 가능한 개체의 기능을 사용하는 경우 서버 개체의 인스턴스를 만들기 전에 RegisterChannel을 호출합니다.
원격 구성 파일에서 채널을 로드할 수도 있습니다. 자세한 내용은 구성을 참조하십시오.
클라이언트쪽에서는 메시지가 클라이언트 체인을 통과한 후에 클라이언트 채널 싱크 체인으로 전달됩니다. 첫 번째 채널 싱크는 일반적으로 포맷터 싱크로, 메시지를 스트림으로 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 포맷터
싱크 및 싱크 체인