서버 활성화
이 항목은 이전 버전의 기존 응용 프로그램과의 호환성을 위해 유지되고 있으나 새로운 개발에는 권장되지 않는 레거시 기술에 대해 설명합니다. 분산 응용 프로그램은 이제 WCF(Windows Communication Foundation)를 사용하여 개발됩니다.
서버가 활성화한 개체는 수명이 서버에 의해 직접 제어되는 개체입니다. 서버 응용 프로그램 도메인은 클라이언트가 new(Visual Basic의 경우 New()) 또는 Activator.GetObject를 호출할 때가 아니라 개체에서 메서드를 호출할 때만 이러한 개체를 만듭니다. 이렇게 하면 전적으로 인스턴스를 만들기 위한 네트워크 라운드트립을 방지할 수 있습니다. 클라이언트에서 서버가 활성화한 형식의 인스턴스를 요청하는 경우 클라이언트 응용 프로그램 도메인에 프록시만 만들어집니다. 이 경우 서버가 활성화한 형식에 대해 기본 생성자만 허용됩니다. 인수를 사용하는 특정 생성자로 해당 인스턴스가 만들어지는 형식을 게시하려면 클라이언트 활성화를 사용하거나 특정 인스턴스를 동적으로 게시할 수 있습니다.
서버 활성화 모드
서버가 활성화한 개체에 대한 두 가지 활성화 모드(또는 WellKnownObjectMode 값)는 Singleton 및 SingleCall입니다.
Singleton 형식은 언제든지 둘 이상의 인스턴스를 사용하지 않습니다. 한 인스턴스가 있으면 모든 클라이언트 요청이 해당 인스턴스에 의해 처리됩니다. 인스턴스가 없으면 서버에서 인스턴스를 만들고 모든 후속 클라이언트 요청이 해당 인스턴스에 의해 처리됩니다. Singleton 형식에는 기본 수명이 연결되어 있으므로 언제든지 하나의 인스턴스만 사용할 수 있지만 클라이언트가 항상 원격으로 사용 가능한 클래스의 동일한 인스턴스에 대한 참조를 받지는 않습니다.
SingleCall 형식은 항상 클라이언트 요청당 하나의 인스턴스를 사용합니다. 시스템에서 이전 인스턴스를 재활용하지 않은 경우에도 다음 메서드 호출이 다른 서버 인스턴스에 의해 처리됩니다. SingleCall 형식은 수명 임대 시스템에 참여하지 않습니다.
서버가 활성화한 형식의 인스턴스를 만들려면 클라이언트에서 프로그래밍 방식으로 또는 구성 파일을 사용하여 응용 프로그램을 구성합니다. 프로그래밍 방식으로 응용 프로그램을 구성하는 경우 Activator.GetObject 메서드를 사용하여 클라이언트에서 서버가 활성화한 개체를 인스턴스화합니다. 구성 파일을 사용하여 응용 프로그램을 구성하는 경우 Activator.GetObject를 호출하거나 새 연산자를 사용하여 클라이언트에서 서버가 활성화한 개체를 인스턴스화할 수 있습니다.
참고: |
---|
클라이언트측에서 채널을 등록할 필요는 없습니다. 클라이언트가 채널을 등록하지 않는 경우 원격 시스템에서 자동으로 Machine.config 파일에 지정된 기본 채널 중 하나를 사용하여 채널을 만들고 나가는 요청을 수행합니다. 클라이언트의 이 자동 채널 선택은 서버의 콜백 함수를 수신 대기할 채널을 등록하지 않으며, machine.config 파일에 사용자 지정 채널을 추가하지 않으면 사용자 지정 채널 구현을 등록하지 않습니다. 이 경우 클라이언트 응용 프로그램 도메인에서 사용할 채널 형식을 등록해야 합니다. |
다음 코드 예제에서는 Activator.GetObject 호출을 보여 줍니다. TcpChannel은 포트 8080에서 통신하도록 등록되었습니다. 클라이언트에서 서버 개체가 특정 인터페이스를 구현한다는 것만 아는 경우 클래스 인스턴스를 만드는 데 new(Visual Basic의 경우 New)만 사용할 수 있으므로 Activator.GetObject 호출을 사용해야 합니다.
Dim MyRemoteClass As RemoteObjectClass = _
CType( _
Activator.GetObject(GetType(RemoteObjectClass), _
"tcp://computername:8080/RemoteObjectUri" ), _
RemoteObjectClass
)
RemoteObjectClass MyRemoteClass = (RemoteObjectClass)Activator.GetObject(
typeof(RemoteObjectClass),
"tcp://computername:8080/RemoteObjectUri "
);
이때 서버와의 실제 통신은 발생하지 않으므로 원격 개체 자체는 인스턴스화되지 않습니다. 대신 클라이언트측에서 프록시 개체가 인스턴스화됩니다. 이제 클라이언트는 원격 개체에 대한 직접 참조인 것처럼 MyRemoteClass
를 사용할 수 있습니다. 클라이언트가 실제로 메서드 호출 간에 통신하는 데 사용하는 RemoteObjectClass 인스턴스는 서버 개체가 Singleton 또는 SingleCall 형식으로 선언되었는지에 따라 달라집니다. 서버 개체의 게시자가 이 정보를 노출하는지 여부에 관계없이 클라이언트는 보유한 개체 참조를 동일하게 처리합니다.
Singleton
COM에서 "singleton"은 클라이언트에 개체에 대한 참조가 있는 한 해당 개체가 메모리에서 삭제되지 않음을 의미합니다. 그러나 .NET Remoting의 Singleton 개체에는 지정된 수명 임대가 적용되므로 클라이언트가 현재 해당 참조를 보유하고 있는 경우에도 재활용될 수 있습니다. MarshalByRefObject의 InitializeLifetimeService 메서드를 재정의하여 null 참조(Visual Basic의 경우 Nothing)를 반환하면 전자 형식의 Singleton 개체를 만들 수 있습니다. 이렇게 하면 호스트 응용 프로그램 도메인이 실행되는 한 개체가 메모리에 유지됩니다. 자세한 내용은 수명 임대를 참조하십시오. 원격 구성 파일에 초기 임대 시간을 구성하면 후자 형식의 Singleton 개체를 만들 수 있습니다.
참고 항목
참조
WellKnownObjectMode Enumeration